JaxbXmlUtil.java 4.12 KB
package com.huaheng.common.utils;


import com.huaheng.common.exception.service.ServiceException;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.*;
import java.text.MessageFormat;

public class JaxbXmlUtil {

    public static final String DEFAULT_ENCODING = "UTF-8";

    /**
     * pojo转换成xml 默认编码UTF-8
     *
     * @param obj 待转化的对象
     * @return xml格式字符串
     * @throws Exception JAXBException
     */
    public static String convertToXml(Object obj) {
        return convertToXml(obj, DEFAULT_ENCODING);
    }

    /**
     * pojo转换成xml
     *
     * @param obj 待转化的对象
     * @param encoding 编码
     * @return xml格式字符串
     * @throws Exception JAXBException
     */
    public static String convertToXml(Object obj, String encoding){

        if(obj != null){
            Marshaller marshaller = null;
            JAXBContext context = null;
            try{
                 context = JAXBContext.newInstance(obj.getClass());
            }catch (Exception e){
                e.printStackTrace();
            }
            try{
                marshaller = context.createMarshaller();
            }catch (Exception e){
                e.printStackTrace();
            }
            // 指定是否使用换行和缩排对已编组 XML 数据进行格式化的属性名称。
            try{
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            }catch (Exception e){
                e.printStackTrace();
            }
            try{
                marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
            }catch (Exception e){
                e.printStackTrace();
            }

            StringWriter writer = new StringWriter();
            try{
                marshaller.marshal(obj, writer);
            }catch (Exception e){
                e.printStackTrace();
            }
            String result = null;
            result = writer.toString();
            writer.flush();
            try{
                writer.close();
            }catch (Exception e){
                e.printStackTrace();
            }
            return result;
        }
        throw new ServiceException("xml对象不能为空!");
    }

    /**
     * xml转换成JavaBean
     *
     * @param xml xml格式字符串
     * @param t 待转化的对象
     * @return 转化后的对象
     * @throws Exception JAXBException
     */
    @SuppressWarnings("unchecked")
    public static <T> T convertToJavaBean(String xml, Class<T> t) throws Exception {
        T obj = null;
        JAXBContext context = JAXBContext.newInstance(t);
        Unmarshaller unmarshaller = context.createUnmarshaller();
        try {
            obj = (T) unmarshaller.unmarshal(new StringReader(xml));
        }catch (Exception e){
            e.printStackTrace();
        }
        return obj;
    }

    @SuppressWarnings("unchecked")
    public static <T> T readConfig(Class<T> clazz, String config, Object... arguments) throws IOException, JAXBException {
        InputStream is = null;
        try {
            if (arguments.length > 0) {
                config = MessageFormat.format(config, arguments);
            }
            // logger.trace("read configFileName=" + config);
            JAXBContext jc = JAXBContext.newInstance(clazz);
            Unmarshaller u = jc.createUnmarshaller();
            is = new FileInputStream(config);
            return (T) u.unmarshal(is);
        } catch (IOException e) {
            throw e;
        } catch (JAXBException e) {
            throw e;
        } finally {
            if (is != null) {
                is.close();
            }
        }
    }

    @SuppressWarnings("unchecked")
    public static <T> T readConfigFromStream(Class<T> clazz, InputStream dataStream) throws JAXBException {
        try {
            JAXBContext jc = JAXBContext.newInstance(clazz);
            Unmarshaller u = jc.createUnmarshaller();
            return (T) u.unmarshal(dataStream);
        } catch (JAXBException e) {
            throw e;
        }
    }


}