文档章节

【撸码师的备忘录】 Java bean 与 xml 互相转化-JDK Marshaller

一介码夫_Hum
 一介码夫_Hum
发布于 2016/04/01 12:14
字数 853
阅读 156
收藏 1

Marshaller Api :  http://www.apihome.cn/api/java/Marshaller.html

 

package lab.s2jh.core.util;

import java.io.StringReader;
import java.io.StringWriter;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

import lab.s2jh.core.annotation.MetaData;
import lab.s2jh.core.exception.ServiceException;
import lombok.Setter;
import lombok.experimental.Accessors;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.collect.Lists;

/**
 * Project :       Monster-frameWork
 * Author:         XIE-HONGFEI
 * Company:        hongfei tld.
 * Created Date:   2016/4/1 0001
 * Copyright @ 2016 Company hongfei tld. – Confidential and Proprietary
 * <p/>
 * History:
 * ------------------------------------------------------------------------------
 *      Date       |      Author     |   Change Description
 * 2016/4/1 0001   |      谢xx        |   初版做成
 *
 *  描述 :
 *  1.利用Java内置JAXB对JavaBean进行序列化为xml或将xml反序列化为java bean对象
 *  2.涉及实体Bean需有 @XmlRootElement 及 @XmlElement 注解
 *    note :
 *    @XmlElement注解只能应用在set方法中,如转换对象为ORM-Entity实体对象,则建议不再使用lombok进行代码处理;
 */

public class JaxbUtils {

    private static final Logger logger = LoggerFactory.getLogger(JaxbUtils.class);

    private JAXBContext jaxbContext;

    /**
     * 构造所有需要序列化类型的JAXBContent对象
     * @param classes
     */
    public JaxbUtils(Class<?>... classes) {
        try {
            jaxbContext = JAXBContext.newInstance(classes);
        } catch (JAXBException e) {
            e.printStackTrace();
            throw new ServiceException("Build JAXBContext Error" + e.getMessage(), e.getCause());
        }
    }

    public String bean2Xml(Object obj) {
        try {
            //输出到控制台
            //createMarshaller().marshal(obj,System.out);

            //输出到字符流
            StringWriter writer = new StringWriter();

            createMarshaller().marshal(obj, writer);

            return writer.toString();

        } catch (JAXBException e) {
            e.printStackTrace();
            throw new ServiceException("Operate marshal error" + e.getMessage(), e.getCause());
        }
    }

    public <T> T xml2Bean(String xmlContent) {

        StringReader reader = new StringReader(xmlContent);

        try {
            return (T) createUnmarshaller().unmarshal(reader);
        } catch (JAXBException e) {
            throw new ServiceException("Resole xml content to bean Error" + e.getMessage(), e.getCause());
        }
    }

    /**
     * Create a <tt>Marshaller</tt> object that can be used to convert a
     * java content tree into XML data.
     *
     * @return a <tt>Marshaller</tt> object
     *
     * @throws JAXBException if an error was encountered while creating the
     *                       <tt>Marshaller</tt> object
     */
    public Marshaller createMarshaller() {
        return createMarshaller(null);
    }

    /**
     * Create a <tt>Marshaller</tt> object that can be used to convert a
     * java content tree into XML data.
     *
     * @return a <tt>Marshaller</tt> object
     *
     * @throws JAXBException if an error was encountered while creating the
     *                       <tt>Marshaller</tt> object
     */
    public Marshaller createMarshaller(String encoding) {
        try {
            Marshaller marshaller = jaxbContext.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            if (StringUtils.isNotBlank(encoding)) {
                marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
            }
            return marshaller;
        } catch (JAXBException e) {
            throw new ServiceException("Create Marshaller Error , " + e.getMessage(), e.getCause());
        }

    }

    /**
     * Create an <tt>Unmarshaller</tt> object that can be used to convert XML
     * data into a java content tree.
     *
     * @return an <tt>Unmarshaller</tt> object
     *
     * @throws JAXBException if an error was encountered while creating the
     *                       <tt>Unmarshaller</tt> object
     */
    public Unmarshaller createUnmarshaller() {
        try {
            return jaxbContext.createUnmarshaller();
        } catch (JAXBException e) {
            throw new ServiceException("Create Unmarshaller Error," + e.getMessage(), e.getCause());
        }
    }

    /**
     * @author Administrator
     *
     */
    @Setter
    @Accessors(chain = true)
    @XmlRootElement(name = "example")
    static class Example {

        private String examId;

        //针对实体属性与xml节点名称不一致的情况,可采用name指定的方式进行映射;

        private String examName;

        private List<ExampleChild> childs;

        @Override
        public String toString() {
            return "no:" + examId + "\n" + "name:" + examName;
        }

        @XmlElement
        public String getExamId() {
            return examId;
        }

        @XmlElement(name = "example_name")
        public String getExamName() {
            return examName;
        }

        //节点外层包裹 example_childs层
        @XmlElementWrapper(name = "example_childs")
        @XmlElement(name = "example_child")
        public List<ExampleChild> getChilds() {
            return childs;
        }

    }

    /**
     * 
     * XmlElement作用于getter
     * @author Administrator
     *
     */
    @Setter
    static class ExampleChild {

        @MetaData(value = "子节点编号")
        private String childNo;

        @MetaData(value = "子节点名称")
        private String childName;

        @XmlElement
        public String getChildNo() {
            return childNo;
        }

        @XmlElement
        public String getChildName() {
            return childName;
        }

    }

    public static void main(String[] args) {

        JaxbUtils jaxbUtils = new JaxbUtils(Example.class);

        Example example = new Example();

        example.setExamId("10086");
        example.setExamName("中国移动示例");

        List<ExampleChild> childs = Lists.newArrayList();
        example.setChilds(childs);
        for (int i = 0; i < 3; i++) {
            ExampleChild child = new ExampleChild();
            child.setChildNo((i + 1) + "");
            child.setChildName("子节点名称-" + i);
            childs.add(child);
        }

        System.out.println("=========================  bean2Xml 结果开始  =============================");
        System.out.println(jaxbUtils.bean2Xml(example));
        System.out.println("=========================  bean2Xml 结果结束  =============================");


        String xmlContent = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<example>\n" + "    <examId>10010</examId>\n"
                + "    <example_name>中国联通示例</example_name>\n" + "</example>";

        Example example2 = jaxbUtils.xml2Bean(xmlContent);

        System.out.println("=========================  xml2Bean 结果开始  =============================");
        System.out.println(JsonUtils.writeValueAsString(example2));
        System.out.println("=========================  xml2Bean 结果开始  =============================");
    }

}

 

 

输出内容:

 

=========================  bean2Xml 结果开始  =============================
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<example>
    <example_childs>
        <example_child>
            <childName>子节点名称-0</childName>
            <childNo>1</childNo>
        </example_child>
        <example_child>
            <childName>子节点名称-1</childName>
            <childNo>2</childNo>
        </example_child>
        <example_child>
            <childName>子节点名称-2</childName>
            <childNo>3</childNo>
        </example_child>
    </example_childs>
    <examId>10086</examId>
    <example_name>中国移动示例</example_name>
</example>

=========================  bean2Xml 结果结束  =============================



=========================  xml2Bean 结果开始  =============================
{"examId":"10010","examName":"中国联通示例","childs":null}
=========================  xml2Bean 结果开始  =============================

 

 

 

 

© 著作权归作者所有

一介码夫_Hum
粉丝 25
博文 122
码字总数 30761
作品 0
海淀
其他
私信 提问
Apache CXF 整合 Map

在进行编码前有必要对一些基本的认识进行介绍,以便后面的讲解。 1、JAXB: JAXB能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,这...

yaokangjun
2014/08/21
1K
1
SpringMVC整合JSON、XML视图

原创不易,转载请注明出处:SpringMVC整合JSON、XML视图 代码下载地址:http://www.zuidaima.com/share/1751862737554432.htm SpringMVC中整合了JSON、XML的视图,可以通过这些视图完成Java对...

最代码
2014/04/16
337
0
Spring MVC RestFul 无法将Map输出为XML格式

在学习Spring Rest 时,发现可以传输各种格式的文件给客户端,但是都是JavaBean对象与Json XML 的转换,现在我想的是,能不能是 Map对象与XML的转换呢?具体应该如何操作呢?我目前的配置文件...

learn_more
2014/10/14
1K
0
用Castor 处理XML文档

用Castor 处理XML文档 ——Castor可以完成Java和XML的相互转换 前面有介绍过json-lib这个框架,在线博文:http://www.cnblogs.com/hoojo/archive/2011/04/21/2023805.html 以及Jackson这个框...

JAVA_NINA
2012/01/13
173
0
jaxb替换smooks项目方案建议书

1 前言 本文档是描述Smooks的应用情况,以及使用Jaxb替换smooks的可行性分析及实施方案,有不足之处还望谅解和指出。 2 背景 项目系统中使用Smooks出现几次死锁问题导致系统宕机,其后针对S...

WinnieChan
2013/08/02
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

高级技术题整理

1. 为什么等待和通知是在 Object 类而不是 Thread 中声明的? 一个棘手的 Java 问题,如果 Java编程语言不是你设计的,你怎么能回答这个问题呢。Java编程的常识和深入了解有助于回答这种棘手...

泉天下
23分钟前
2
0
Elasticsearch

1 、下载 下载地址:https://www.elastic.co/downloads/past-releases 2 、安装 elasticsearch无需安装,解压即用。 3.运行 进入elasticsearch/bin目录,可以看到下面的执行文件: 双击运行 ...

少年已不再年少
23分钟前
5
0
Spring Boot 2.X(七):Spring Cache 使用

Spring Cache 简介 在 Spring 3.1 中引入了多 Cache 的支持,在 spring-context 包中定义了org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 两个接口来统一不同......

朝雾轻寒
25分钟前
3
0
java路径问题

在Java中有几种常见获取文件路径的方法,此处演示下用法和效果。 测试项目目录结构如右图: 1、使用File类 File file = new File("");// Java项目中-->D:\WorkSoftware\Workspace\EclipseP...

随心の随缘
27分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部