Jaxb2 技术指南文档格式.docx
- 文档编号:6725633
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:16
- 大小:19.94KB
Jaxb2 技术指南文档格式.docx
《Jaxb2 技术指南文档格式.docx》由会员分享,可在线阅读,更多相关《Jaxb2 技术指南文档格式.docx(16页珍藏版)》请在冰点文库上搜索。
importjavax.xml.bind.Unmarshaller;
importorg.junit.After;
importorg.junit.Before;
importorg.junit.Test;
importcom.hoo.entity.Account;
importcom.hoo.entity.AccountBean;
importcom.hoo.entity.Birthday;
importcom.hoo.entity.ListBean;
importcom.hoo.entity.MapBean;
/**
*<
b>
function:
<
/b>
Jaxb2完成Java和XML的编组、解组
*@authorhoojo
*@createDate2011-4-25上午11:
54:
06
*@fileJaxb2Test.java
*@packagecom.hoo.test
*@projectWebHttpUtils
*@blog
*@emailhoojo_@
*@version1.0
*/
publicclassJaxb2Test{
privateJAXBContextcontext=null;
privateStringWriterwriter=null;
privateStringReaderreader=null;
privateAccountBeanbean=null;
@Before
publicvoidinit(){
bean=newAccountBean();
bean.setAddress("
北京"
);
bean.setEmail("
email"
bean.setId
(1);
bean.setName("
jack"
Birthdayday=newBirthday();
day.setBirthday("
2010-11-22"
bean.setBirthday(day);
try{
context=JAXBContext.newInstance(AccountBean.class);
}catch(Exceptione){
e.printStackTrace();
}
}
@After
publicvoiddestory(){
context=null;
bean=null;
if(writer!
=null){
writer.flush();
writer.close();
}
if(reader!
reader.close();
}catch(IOExceptione){
System.gc();
publicvoidfail(Objecto){
System.out.println(o);
publicvoidfailRed(Objecto){
System.err.println(o);
}
通过JAXBContext的newInstance方法,传递一个class就可以获得一个上下文。
newInstance方法也可以传递一个xml的文件的path。
通过xml文件,对class的描述进行转换。
然后,就可以通过这个上下文的来创建一个Marshaller,通过Marshaller对象的marshal方法就可以转换JavaBean对象到xml。
同样JAXBContext也可以创建一个Unmarshall的unmarshal方法可以进行xml到Java对象的解组。
二、对Java编组、XML解组
1、JavaBean和XML的相互转换
代码如下:
@Test
publicvoidtestBean2XML(){
try{
//下面代码演示将对象转变为xml
Marshallermar=context.createMarshaller();
writer=newStringWriter();
mar.marshal(bean,writer);
fail(writer);
//下面代码演示将上面生成的xml转换为对象
reader=newStringReader(writer.toString());
Unmarshallerunmar=context.createUnmarshaller();
bean=(AccountBean)unmar.unmarshal(reader);
fail(bean);
}catch(JAXBExceptione){
e.printStackTrace();
上面的context是在init方法中创建的,它传递了一个AccountBean的class,这个AccountBean不是一般的普通的bean。
除了它带有getter、setter方法外,还有Annotation注解。
下面我们就看看这个bean的代码。
packagecom.hoo.entity;
importjavax.xml.bind.annotation.XmlAttribute;
importjavax.xml.bind.annotation.XmlRootElement;
importcom.sun.xml.internal.txw2.annotation.XmlElement;
@XmlRootElement(name="
account"
)
publicclassAccountBean{
privateintid;
privateStringname;
privateStringemail;
privateStringaddress;
privateBirthdaybirthday;
@XmlElement
publicBirthdaygetBirthday(){
returnbirthday;
publicvoidsetBirthday(Birthdaybirthday){
this.birthday=birthday;
@XmlAttribute(name="
number"
publicintgetId(){
returnid;
publicvoidsetId(intid){
this.id=id;
publicStringgetName(){
returnname;
publicvoidsetName(Stringname){
this.name=name;
publicStringgetEmail(){
returnemail;
publicvoidsetEmail(Stringemail){
this.email=email;
publicStringgetAddress(){
returnaddress;
publicvoidsetAddress(Stringaddress){
this.address=address;
@Override
publicStringtoString(){
returnthis.name+"
#"
+this.id+"
+this.address+"
+this.birthday+"
+this.email;
上面的XmlRootElement是设置当前对象转换成xml后的根节点,name的值是设置根节点的名称。
在getter方法上设置XmlElement表示这个方法对应的属性是一个xml元素,如果这个注解还设置了name,那么这个name就是转换后xml的名称。
在一个属性上设置XmlAttribute,表示这个方法对应的属性在转换xml后是父元素的一个属性。
XmlAttribute的name就是转换后xml的属性的name。
运行后,结果如下:
?
xmlversion="
1.0"
encoding="
UTF-8"
standalone="
yes"
>
accountnumber="
1"
address>
北京<
/address>
birthday>
2010-11-22<
/birthday>
email>
email<
/email>
name>
jack<
/name>
/account>
jack#1#北京#2010-11-22#email
把转换后的xml和上面的AccountBean对应看看
2、对List类型对象,进行编组、解组
publicvoidtestList2XML(){
ListBeanlistBean=newListBean();
listBean.setName("
listtoxml"
List<
Object>
list=newArrayList<
();
list.add(bean);
bean=newAccountBean();
bean.setAddress("
china"
bean.setEmail("
tom@"
bean.setId
(2);
bean.setName("
tom"
Birthdayday=newBirthday("
bean.setBirthday(day);
Accountacc=newAccount();
acc.setAddress("
acc.setEmail("
acc.setId
(2);
acc.setName("
day=newBirthday("
acc.setBirthday(day);
list.add(acc);
listBean.setList(list);
context=JAXBContext.newInstance(ListBean.class);
mar.marshal(listBean,writer);
listBean=(ListBean)unmar.unmarshal(reader);
fail(listBean.getList().get(0));
fail(listBean.getList().get
(1));
fail(listBean.getList().get
(2));
你不能直接new一个List,然后将对象放到List中。
进行编组、解组,这样会出现异常情况的。
你需要构建一个JavaBean,在bean中创建一个List的属性。
然后在这个属性的getter方法上进行Annotation注解。
下面我们看看ListBean的代码:
importjavax.xml.bind.annotation.XmlElement;
importjavax.xml.bind.annotation.XmlElements;
@SuppressWarnings("
unchecked"
list-bean"
publicclassListBean{
privateListlist;
@XmlElements({
@XmlElement(name="
type=Account.class),
bean"
type=AccountBean.class)
})
publicListgetList(){
returnlist;
publicvoidsetList(Listlist){
this.list=list;
@XmlAttribute
XmlElements表示是一个集合类型,然后注解在集合中存放上面类型的对象。
XmlElement表示在集合中存放的一个对象类型和元素名称。
转换后结果如下:
list-beanname="
beannumber="
/bean>
2"
china<
tom@<
tom<
account>
id>
2<
/id>
/list-bean>
tom#2#china#2010-11-22#tom@
2#tom#tom@#china#2010-11-22
转换后的XML和Bean的注解的描述是一样的吧。
3、对Map集合进行解组、编组
Map需要自己实现,可以构造一个简单的Map对象实现
*
*@createDate2010-12-1上午10:
23:
26
publicvoidtestMap2XML(){
MapBeanmapBean=newMapBean();
HashMap<
String,AccountBean>
map=newHashMap<
map.put("
NO1"
bean);
NO2"
mapBean.setMap(map);
context=JAXBContext.newInstance(MapBean.class);
mar.marshal(mapBean,writer);
mapBean=(MapBean)unmar.unmarshal(reader);
fail(mapBean.getMap());
下面看看MapBean的代码
importjavax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
importcom.hoo.util.MapAdapter;
@XmlRootElement
publicclassMapBean{
privateHashMap<
map;
@XmlJavaTypeAdapter(MapAdapter.class)
publicHashMap<
getMap(){
returnmap;
publicvoidsetMap(HashMap<
map){
this.map=map;
上面的map集合的getter方法有一个XmlJavaTypeAdapter,需要传递一个Adapter的类型。
下面看看MyAdapter的代码
packagecom.hoo.util;
importjavax.xml.bind.annotation.adapters.XmlAdapter;
AccountBean编组、解组的XmlAdapter
*@createDate2011-4-25下午0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Jaxb2 技术指南 技术 指南