这是原始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属性定义这个父节点的名称。
到此结束,以上为我本次操作的记录和学习。。。
不积跬步,无以至千里。