浅谈JAXBContext实现实体/XML相互转换
解读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属性。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇