1. 背景 : 今天上线突然遇到一个很有意思的问题,使用fastxml将实体类转换为xml格式的过程中,我的实体类并未出现的属性却无缘无故的给我多转换了一个标签。相关代码如下。
/**
*生成的响应头
*/
@JacksonXmlRootElement(localName="response")
@Data
public Head{
private String function;
private String version;
private String signType;
private String respTime;
private String respTimeZone;
}
/**
*生成的响应体
*/
@JacksonXmlRootElement(localName="response")
@Data
public class Response{
private Head head;
@XmlElement
private Object body;
}
/**
*生成最终的实体类
*/
@JacksonXmlRootElement(localName="document")
@Data
public class RespData{
private Resopnse response;
private String signautre;
public Map<String,Object> getMessage(){
Map<String,Object> map=new HashMap<>();
map.put("function",this.response.getHead.getFunction());
map.put("body",this.response.getBody);
return map;
}
}
/**
*转换的xml类。
*
*/
public class BeanToXml{
private static final String XML_HEAD="<?xml version=\"1.0\" encoding=\"UTF-8\">";
public static String javaBeanToXml(Object obj){
String xml="";
if(Objects.isNull(obj)){
return xml;
}
try{
XmlMapper xmlMapper=new XmlMapper();
xml=xmlMpper.witeValueAsString(obj);
}
return XML_HEAD+xml;
}
.....
}
实际上我是不想要message这个标签的,但是出现了这个标签,而且内容都是重复的。
经过一系列的探索,我终于发现了问题的所在,就是因为我再最终生成的那个实体类中多了一个getMessage的方法导致的。所以记录一下,以免再次出现了不知道。
2. 产生的原因
如果序列化库(如JAXB、Jackson等)默认遵循JavaBean规范,且 getMessage() 是符合规范的getter方法(无参数、非静态、返回非void),则会将返回值序列化为 标签。
3.解决的办法
a.排除message:使用注解标记 getMessage() 不参与序列化。
JAXB示例:
@XmlTransient // 排除此字段/方法
public String getMessage() { … }
Jackson示例:
@JsonIgnore // 忽略此属性
public String getMessage() { … }
b. 非JavaBean方法:如果方法不符合getter规范(例如有参数、静态方法等)
5万+

被折叠的 条评论
为什么被折叠?



