Java实现xml与实体类的转换过程中遇到的问题

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规范(例如有参数、静态方法等)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TTQYXW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值