今天在用 jaxb 做 xml 转对象时,遇到俩问题。先记录一下:
实例要转的xml
<?xml version="1.0" encoding="utf-8"?>
<root>
<ret_code>0000</ret_code>
<ret_msg>无此退款单据</ret_msg>
<agent_id>1664502</agent_id>
<detail_data> -1 </detail_data>
<sign>8c52afd867f7f23f9a5aa692558</sign>
</root>
转为对象
@Data
@XmlRootElement(name="root")
@XmlAccessorType(XmlAccessType.FIELD)
public class Test {@XmlElement(name="ret_code")private String retCode;@XmlElement(name="ret_msg")private String retMsg;@XmlElement(name="agent_id")private String agentId;@XmlElement(name="agent_bill_id")private String agentBillId;@XmlElement(name="agent_refund_bill_id")private String agentRefundBillId;@XmlElement(name="refund_amt")private String refundAmt;@XmlElement(name="refund_status")private String refundStatus;@XmlElement(name="deal_time")private String dealTime;@XmlElement(name="out_bill_id")private String outBillId;@XmlElement(name="detail_data")private String detailData;@XmlElement(name="sign")private String sign;}
以下为出现的来问题:
① 意外的元素 (uri:"", local:"root")。所需元素为(none)
分析:
此问题是 Test 类没有加 @XmlRootElement(name="root") 注解所导致的
XmlRootElement@XmlRootElement: 将类或枚举类型映射到 XML 元素,是 xml 文件的根元素。JAXB 中的注解,用来根据 java 类生成xml内容。
当使用 @XmlRootElement 注释对顶层类或枚举类型进行注释时,类型值被表示为 XML 文档中的 XML 元素。
② jaxb 对象转xml 报错:类的两个属性具有相同名称 lombok(@Data)
分析:
此问题正常需要从 get 方法上加 @XmlTransient 来避免此错误,但由于茜茜使用的是 lombok 的 @Data,且写在 get 上显得代码比较乱,于是就继续搜有没有更好的方法。
就发现了 W3C school 里的文档有介绍
XmlAccessorType_w3cschool
@XmlAccessorType
类级别的注解。定义这个类中的何种类型需要映射到XML。解释起来有点拗口,可以通过它的属性值更好理解这个参数的意义。
参数 value
参数 value 可以接受4个指定值,这几个值是枚举类型,方便调用:
- XmlAccessType.FIELD:映射这个类中的所有字段到XML
- XmlAccessType.PROPERTY:映射这个类中的属性(get/set方法)到XML
- XmlAccessType.PUBLIC_MEMBER:将这个类中的所有public的field或property同时映射到XML(默认)
- XmlAccessType.NONE:不映射
于是就加上试了试,即 Test 类的
@XmlAccessorType(XmlAccessType.FIELD)
果然很好使,于是问题解决。
再次记录一下,希望能帮到你呀。
本文发布于:2024-02-08 20:11:52,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170739459368759.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |