`
wode66
  • 浏览: 743226 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAXB--@XmlElementWrapper注解和泛型一起使用(三)

阅读更多

当java对象的某个属性使用泛型时,普通对象都没问题,但是遇到HashSet这种集合类封装的元素时,就会出现元素内容序列化不出来的问题,详见如下:

 

一、示例:

第一步:定义java对象

 

package step3;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
@XmlAccessorType(value = XmlAccessType.PROPERTY)
public class Customer<T> {
	String name;
	int age;
	int id;
	T t;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	
	@Override
	public String toString() {
		return "Customer [id=" + id + ",name=" + name + ",age=" + age + ",t=" + t + "]";
	}

	public T getT() {
		return t;
	}

	public void setT(T t) {
		this.t = t;
	}
}

 

 

 

package step3;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;

@XmlAccessorType(value = XmlAccessType.PROPERTY)
public class Book {
	
	private String id;
	private String name;
	private float price;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public float getPrice() {
		return price;
	}
	public void setPrice(float price) {
		this.price = price;
	}
	@Override
	public String toString() {
		return "Book [id=" + id + ",name=" + name + ",price=" + price + "]";
	}
}
 

第二步:编组(JAXBContext.newInstance(Customer.class,HashSet.class);方法添加了

HashSet的class对象,以提供给JAXBContext使用。

 

package step3;
import java.io.File;
import java.util.HashSet;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

//Marshaller
public class Object2XmlDemo {
	public static void main(String[] args) {

		Customer<HashSet<Book>> customer = new Customer<HashSet<Book>>();
		customer.setId(100);
		customer.setName("suo");
		customer.setAge(29);
		
		Book book = new Book();
		book.setId("1");
		book.setName("哈里波特");
		book.setPrice(100);
		
		Book book2 = new Book();
		book2.setId("2");
		book2.setName("苹果");
		book2.setPrice(50);
		
		HashSet<Book> bookSet = new HashSet<Book>();
		bookSet.add(book);
		bookSet.add(book2);
		
		customer.setT(bookSet);
		
		try {
			File file = new File("C:\\file1.xml");
			JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class,
					HashSet.class);
			Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
			// output pretty printed
			jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
			jaxbMarshaller.marshal(customer, file);
			jaxbMarshaller.marshal(customer, System.out);
		} catch (JAXBException e) {
			e.printStackTrace();
		}
	}
}

 

得到的xml:

 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer>
    <age>29</age>
    <id>100</id>
    <name>suo</name>
    <t xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="hashSet"/>
</customer>

 

 

注:

1.泛型使用集合元素替代时,泛型属性所对应的xml没有序列化出来。

2.若JAXBContext.newInstance(Customer.class,HashSet.class);不添加HashSet

的class对象,则报错:

[javax.xml.bind.JAXBException: class java.util.HashSet nor any of its super class is known to this context.]

 

解决办法:

第一步:新增HashSet的包装类

 

Book类和Customer类相关代码均不需要改变,新增一个HashSet的包装类,定义如下:

 

package step4;

import java.util.HashSet;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;

public class BookSet {
	
	private HashSet<Book> bookSet = new HashSet<Book>();

	//仅包含get方法,未包含set方法
	@XmlElementWrapper(name = "bookSet")//该注解非必须,仅是标注集合元素
	@XmlElement(name="book")
	public HashSet<Book> getBookSet() {
		return bookSet;
	}

	public void addBook(Book book){
		bookSet.add(book);
	}
	
}

 

 

注:

1.BookSet类内部使用HashSet实现.

2.BookSet类在get方法上添加了@XmlElementWrapper(name = "bookSet")注解。

 

第二步:编组

 

package step4;

import java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

//Marshaller
public class Object2XmlDemo {
	public static void main(String[] args) {

		Customer<BookSet> customer = new Customer<BookSet>();
		customer.setId(100);
		customer.setName("suo");
		customer.setAge(29);
		
		Book book = new Book();
		book.setId("1");
		book.setName("哈里波特");
		book.setPrice(100);
		
		Book book2 = new Book();
		book2.setId("2");
		book2.setName("苹果");
		book2.setPrice(50);
		
		BookSet bookSet = new BookSet();
		bookSet.addBook(book);
		bookSet.addBook(book2);
		
		customer.setT(bookSet);
		
		try {
			File file = new File("C:\\file1.xml");
			JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class,
					BookSet.class);
			Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
			// output pretty printed
			jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
			jaxbMarshaller.marshal(customer, file);
			jaxbMarshaller.marshal(customer, System.out);
		} catch (JAXBException e) {
			e.printStackTrace();
		}
	}
}

 

 

注:

1.定义Customer对象时,使用包装类,即:

Customer<BookSet> customer = new Customer<BookSet>();

2.JAXBContext调用newInstance()方法时,传入BookSet的class对象,告知BookSet的类型,即:JAXBContext.newInstance(Customer.class,BookSet.class);

 

得到的xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer>
    <age>29</age>
    <id>100</id>
    <name>suo</name>
    <t xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="bookSet">
        <bookSet>
            <book>
                <id>2</id>
                <name>苹果</name>
                <price>50.0</price>
            </book>
            <book>
                <id>1</id>
                <name>哈里波特</name>
                <price>100.0</price>
            </book>
        </bookSet>
    </t>
</customer>
 

 

 

分享到:
评论

相关推荐

    javax.rar(jaxb-impl-2.3.0、jaxb-core-2.3.0、jaxb-api-2.3.0)

    标题中的"jaxb-impl-2.3.0、jaxb-core-2.3.0、jaxb-api-2.3.0"是JAXB的不同组件版本号,它们在处理XML到Java对象之间的转换时起到关键作用。在描述中提到的“Maven项目中缺少jaxb-api的异常报错”,通常指的是在运行...

    jaxb-api-2.1.jar 和 jaxb-impl-2.1.8.jar

    在使用这两个库文件时,通常需要同时包含`jaxb-api.jar`和`jaxb-impl.jar`,因为API库提供了接口定义,而实现库提供了具体的实现。有时候,为了完整支持JAXB功能,可能还需要其他相关库,如`activation.jar`...

    jaxb-api-2.3.1-API文档-中文版.zip

    赠送jar包:jaxb-api-2.3.1.jar; 赠送原API文档:jaxb-api-2.3.1-javadoc.jar; 赠送源代码:jaxb-api-2.3.1-sources.jar; 赠送Maven依赖信息文件:jaxb-api-2.3.1.pom; 包含翻译后的API文档:jaxb-api-2.3.1-...

    jaxb-runtime-2.3.5-API文档-中英对照版.zip

    赠送jar包:jaxb-runtime-2.3.5.jar; 赠送原API文档:jaxb-runtime-2.3.5-javadoc.jar; 赠送源代码:jaxb-runtime-2.3.5-sources.jar; 赠送Maven依赖信息文件:jaxb-runtime-2.3.5.pom; 包含翻译后的API文档:...

    jaxb-runtime-2.3.5-API文档-中文版.zip

    赠送jar包:jaxb-runtime-2.3.5.jar; 赠送原API文档:jaxb-runtime-2.3.5-javadoc.jar; 赠送源代码:jaxb-runtime-2.3.5-sources.jar; 赠送Maven依赖信息文件:jaxb-runtime-2.3.5.pom; 包含翻译后的API文档:...

    JAXB2 jaxb-api.jar jaxb-xjc.jar jaxb-impl.jar activation.jar

    1. **jaxb-api.jar**:这是JAXB2的主要API接口定义,包含了所有的注解和接口,如`@XmlRootElement`、`@XmlElement`等,以及用于转换的核心类,如`Unmarshaller`和`Marshaller`。这个jar文件提供了与XML绑定的基本...

    jackson-module-jaxb-annotations-2.7.8-API文档-中英对照版.zip

    赠送jar包:jackson-module-jaxb-annotations-2.7.8.jar; 赠送原API文档:jackson-module-jaxb-annotations-2.7.8-javadoc.jar; 赠送源代码:jackson-module-jaxb-annotations-2.7.8-sources.jar; 赠送Maven依赖...

    activation.jar jaxb1-impl.jar jaxb-api.jar jaxb-impl.jar jaxb-xjc.jar jsr173_1.0

    它通常与jaxb-api.jar一起使用,以提供完整的JAXB功能。 5. **jaxb-xjc.jar**:这个库包含了XJC工具,它是JAXB编译器,可以将XML Schema转换为对应的Java源代码。通过XJC,开发者可以直接从XML Schema生成Java类,...

    jaxb-api.jar.jaxws-api.zip_ jaxb-api.jar_cxf_jax-ws.jar_jaxb-api

    **冲突解决** 当使用CXF框架并遇到与JDK 6内置JAXB库的冲突时,可以通过引入外部的`jaxb-api.jar`和`jaxws-api.jar`来解决。这两个jar文件提供了与CXF兼容的JAXB和JAX-WS实现,避免了与系统默认库的冲突。 **...

    jaxb-svg11-1.0.2-API文档-中文版.zip

    赠送jar包:jaxb-svg11-1.0.2.jar; 赠送原API文档:jaxb-svg11-1.0.2-javadoc.jar; 赠送源代码:jaxb-svg11-1.0.2-sources.jar; 赠送Maven依赖信息文件:jaxb-svg11-1.0.2.pom; 包含翻译后的API文档:jaxb-svg11...

    jaxb-impl.jar jaxb-api.jar jsr173_1.0_api.jar

    这个实现库通常与`jaxb-api.jar`一起使用,因为后者包含了JAXB的API定义,但不包含具体实现。 `jaxb-api.jar`则包含了JAXB的公共API,这是开发人员在编写JAXB应用程序时需要导入的库。它定义了如`javax.xml.bind....

    jaxb-core-2.3.0.jar

    有关Maven项目中缺少jaxb-api的异常报错解决,jaxb-core-2.3.0.jar

    jaxb-api jaxb-impl jar

    在使用`jaxb-api-2.1.13.jar`和`jaxb-impl-2.1.13.jar`时,需要注意它们是针对JAXB 2.1版本的。随着JAXB的发展,新的版本可能会添加更多的特性,修复已知问题,因此在选择版本时应确保与项目的其他依赖兼容。同时,...

    jaxb-core-2.2.10-b140310.1920-API文档-中文版.zip

    赠送jar包:jaxb-core-2.2.10-b140310.1920.jar; 赠送原API文档:jaxb-core-2.2.10-b140310.1920-javadoc.jar; 赠送源代码:jaxb-core-2.2.10-b140310.1920-sources.jar; 赠送Maven依赖信息文件:jaxb-core-...

    jaxb-impl-2.2.10-b140310.1920-API文档-中文版.zip

    赠送jar包:jaxb-impl-2.2.10-b140310.1920.jar; 赠送原API文档:jaxb-impl-2.2.10-b140310.1920-javadoc.jar; 赠送源代码:jaxb-impl-2.2.10-b140310.1920-sources.jar; 赠送Maven依赖信息文件:jaxb-impl-...

    jaxb-api-2.2 jaxb-impl

    在使用webservice,mule esb等需要jaxb的项目里经常会出现 JAXB 2.0 API is being loaded from the bootstrap classloader这个错误,按照打出的信息Use the endorsed directory mechanism to place jaxb-api.jar in ...

    jersey-media-jaxb-2.22.2-API文档-中英对照版.zip

    赠送jar包:jersey-media-jaxb-2.22.2.jar; 赠送原API文档:jersey-media-jaxb-2.22.2-javadoc.jar; 赠送源代码:jersey-media-jaxb-2.22.2-sources.jar; 赠送Maven依赖信息文件:jersey-media-jaxb-2.22.2.pom;...

    jaxb-impl-2.3.0.jar

    有关Maven项目中缺少jaxb-api的异常报错解决,jaxb-impl-2.3.0.jar

    jaxb-api jaxb-impl jaxb-xjc jaxws-rt jar包

    了解并熟练掌握JAXB和JAX-WS的使用,对于任何Java开发者来说都是至关重要的,特别是那些涉及Web服务和XML数据交换的项目。这些技术不仅简化了开发流程,还提高了代码的可维护性和可扩展性。通过合理利用这些库,...

    jaxb-impl-2.1.13.jar

    jaxb-impl-2.1.13.jar

Global site tag (gtag.js) - Google Analytics