解读JAXBContext类
JAXBContext是整个JAXB API的入口。主要用来构建JAXB实例(newInstance()),并提供与XML/Java绑定信息相关的抽象方法,如编组(createMarshaller())、解组(createUnmarshaller())和验证(createValidator()),其中与验证相关的方法已废弃(Deprecated),被Validator所替代。
1、newInstance(): 应用程序可以通过多种途径获得JAXBContext实例,它们拥有相同的函数名,只是参数不同。
(1) 创建JAXB实例
- 1 单个对象需要注册
// 实体class
JAXBContext context = JAXBContext.newInstance(User.class);
// 指定完整路径
JAXBContext context = JAXBContext.newInstance(com.liantuo.contrast.util.jaxb.User.class);
- 2 多个对象需要注册
// 多个实体编组
JAXBContext context = JAXBContext.newInstance(User.class,Person.class);
// 某个包下所有实体进行编组
JAXBContext context = JAXBContext.newInstance("com.drizzle.entity");
2、createMarshaller()创建一个Marshaller对象,用于将Java内容转换为XML数据.
对使用工厂方法手动创建的内容进行编组与unmarshal操作结果的内容进行编组没有本质区别.客户端可以将Java内容编组成java.io.OutputStream或者java.io.Writer的XML数据.编组程序可以生成已经注册号的SAX2事件流,也可以生成一个DOM节点对象.
3、createUnmarshaller()创建一个可以用来将XML数据转换为java内容树的Unmarshaller对象.
该方法允许将模式中声明的任何全局XML元素解组为实例文档的根元素.
4、createBinder()创建一个可用于关联/原地解组/编组操作的Binder对象.如果不传参数,默认使用W3C DOM创建一个Binder.
5、JAXBContext 为了性能上的考虑,将会对JAXBContext做缓存,不过缓存使用到了WeakReference,不用担心GC问题.
示例demo:实体转换为XML,并导出为XML文件
@XmlRootElement
public class Voucher {
private String pkVoucher;
private String pkVouCherType;
private List<Item> details;
public String getPkVoucher() {
return pkVoucher;
}
public void setPkVoucher(String pkVoucher) {
this.pkVoucher = pkVoucher;
}
@XmlAttribute
public String getPkVouCherType() {
return pkVouCherType;
}
public void setPkVouCherType(String pkVouCherType) {
this.pkVouCherType = pkVouCherType;
}
@XmlElementWrapper(name = "details")
@XmlElement(name = "item")
public List<Item> getDetails() {
return details;
}
public void setDetails(List<Item> details) {
this.details = details;
}
}
public class Item {
private String detailIndex;
private String accSubjCode;
private String explanation;
private String verifyDate;
/** get set...*/
}
// 业务
@Service
public class XmlServiceImpl {
public void handleXml(HttpServletResponse response) throws JAXBException, IOException {
Voucher voucher = new Voucher();
voucher.setPkVoucher("PK券...");
voucher.setPkVouCherType("凭证类型...");
Item item = new Item();
item.setExplanation("这是描述...");
item.setAccSubjCode("主题代码...");
List<Item> items = new ArrayList<>();
items.add(item);
items.add(item);
voucher.setDetails(items);
//MessageListVO: 最外层对象类
JAXBContext context = JAXBContext.newInstance(Voucher.class);
Marshaller marshaller = context.createMarshaller();
//设置编码格式
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
//设置按照xml格式化输出
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
// 设置响应以附件形式下载
response.setHeader("Content-Disposition", "attachment;filename=" + "a.xml");
// 写入响应流
marshaller.marshal(voucher, response.getOutputStream());
}
}
最终效果:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<voucher pkVouCherType="凭证类型...">
<details>
<item>
<accSubjCode>主题代码...</accSubjCode>
<explanation>这是描述...</explanation>
</item>
<item>
<accSubjCode>主题代码...</accSubjCode>
<explanation>这是描述...</explanation>
</item>
</details>
<pkVoucher>PK券...</pkVoucher>
</voucher>
实体相关注解:
@XmlType,将Java类或枚举类型映射到XML模式类型
@XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标注)字段到XML。其他值还有XmlAccessType.PROPERTY和XmlAccessType.NONE。
@XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。
@XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。
@XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。
@XmlRootElement,将Java类或枚举类型映射到XML元素。
@XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素。
@XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性。