记一次xml转化javabean

本文记录了一次使用JAXB将XML转换为JavaBean的过程。在转化中遇到了因注解和getter/setter方法导致的IllegalAnnotationExceptions错误。文中详细介绍了@XmlRootElement、@XmlAccessorType、@XmlAttribute、@XmlElement和@XmlElementWrapper等关键注解的用途和使用方法,旨在分享学习心得。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是原始xml

<?xml version="1.0" encoding="GBK"?>
<p>
    <s errcode="-1"/>
    <s errcode_text="请检查请求信息是否正确!"/>
</p>

要把它转化成为javabean。

刚开始看到这个xml,有点懵圈,咋还有这种样式的报文。百度了一下,原来这个是xml项的属性,是我孤陋寡闻,见识浅薄了。。。(笑哭)

ok,开始转化,使用的是JAXB进行转化

以下是公司项目中使用的代码

public static <T> T convertToJavaBean(String xml, Class<T> cls) {
	T t = null;
	try {
		JAXBContext jaxbContext = JAXBContext.newInstance(cls);
		Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
		t = (T) unmarshaller.unmarshal(new StringReader(xml));
	} catch (JAXBException e) {
		logger.error("xml convert to JavaBean has error." + e.getLocalizedMessage());
		throw new ServiceException("xml convert to JavaBean has error.");
	}
	return t;
}

ok,创建接收类(这是调试过后的代码,可以正常使用!!!)

@XmlAccessorType(XmlAccessType.FIELD)
//@XmlAccessorType(XmlAccessType.PROPERTY) //注意此处注释的代码
@XmlRootElement(name = "p")
class XmlBean {

    @XmlElement(name = "s")
    private List<S> s;
//注意此处注释的代码
//    public List<S> getS() {
//        return s;
//    }
//
//    public void setS(List<S> s) {
//        this.s = s;
//    }
}

class S {

    private Integer lesbErrcode;

    private StringlesbErrcodeText;


    public Integer getLesbErrcode() {
        return lesbErrcode;
    }
    @XmlAttribute(name = "errcode")
    public void setLesbErrcode(Integer lesbErrcode) {
        this.lesbErrcode = lesbErrcode;
    }


    public String getLesbErrcodeText() {
        return lesbErrcodeText;
    }
    @XmlAttribute(name = "errcode_text")
    public void setLesbErrcodeText(String lesbErrcodeText) {
        this.lesbErrcodeText = lesbErrcodeText;
    }
}

以下是在调试过程中遇到的问题:

xml convert to JavaBean has error.2 counts of IllegalAnnotationExceptions

(xml在转化javabean的过程中存在2个错误,2个非法注解 <======= 一定要看这个!!!)

这个问题出现在几个注解的位置或者是注解和是否存在getter/setter代码上。

几个常用的注释,顺带说明下,在本次操作中得到的使用方法 (苦笑)

1.@XmlRootElement,用于类级别的注解,对应xml的跟元素。通过name属性定义这个根节点的名称。

这个看名字就知道,是对应了xml最外层的元素名称

2.@XmlAccessorType,定义映射这个类中的何种类型都需要映射到xml。(如果不存在@XmlAccessorType,默认使用XmlAccessType.PUBLIC_MEMBER注解)(特别是这个需要注意!!!

  参数:XmlAccessType.FIELD: java对象中的所有成员变量。(使用这个注解,是指xml的元素直接对应了javabean的成员属性,所以即使有getter/setter方法,指定元素的@XmlElement注解也要写在成员属性上,不然就会出现以上异常。

  XmlAccessType.PROPERTY:java对象中所有通过getter/setter方式访问的成员变量。(使用这个注解,就一定要getter/setter方法,并且需要将@XmlElement注解写在getter或者是setter上,不能写在成员属性上

  XmlAccessType.PUBLIC_MEMBER:java对象中所有的public访问权限的成员变量和通过getter/setter方式访问的成员变量。(因为一般javabean中的成员属性是private,所以要有getter/setter方法,并且@XmlElement注解写在getter或者是setter上

  XmlAccessType.NONE: java对象的所有属性都不映射为xml的元素。(这个。。。没用到,而且怎么验证好像都缺点意思)

3.@XmlAttribute,用于把java对象的属性映射为xml的属性,并可通过name属性为生成的xml属性指定别名。(这个就是在标签里的属性对应的注解

4.@XmlElement,指定一个字段或get/set方法映射到xml的节点。通过name属性定义这个根节点的名称。

5.@XmlElementWrapper,为数组或集合定义一个父节点。通过name属性定义这个父节点的名称。

到此结束,以上为我本次操作的记录和学习。。。

不积跬步,无以至千里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值