zoukankan      html  css  js  c++  java
  • 使用jaxb进行xml到bean的转换(尝试解决空值不显示问题)

    import javax.xml.bind.Marshaller;
    import java.lang.reflect.Field;
    //监听生成xml文件过程
    public class MarshallerListener extends Marshaller.Listener {
    
        public static final String BLANK_CHAR = "";
    
        @Override
        public void beforeMarshal(Object source) {
            super.beforeMarshal(source);
            Field[] fields = source.getClass().getDeclaredFields();
            for (Field f : fields) {
                f.setAccessible(true);
                try {
                    System.out.println(f.getType() + f.getName());
                    if (f.getType() == String.class && f.get(source) == null) {
                        f.set(source, BLANK_CHAR);
                    }else if(!isBaseType(f)&& f.get(source) != null){
                        beforeMarshalClass(f.get(source));
                    }
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
        
        private void beforeMarshalClass(Object source) {
            // TODO Auto-generated method stub
            Field[] fields = source.getClass().getDeclaredFields();
            for (Field f : fields) {
                f.setAccessible(true);
                try {
                    if (f.getType() == String.class && f.get(source) == null) {
                        f.set(source, BLANK_CHAR);
                    }else if(!isBaseType(f) && f.get(source) != null){
                        System.out.println(f.getType()+f.getName());
                        beforeMarshalClass(f.get(source));
                    }
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
        * 判断object是否为基本类型
        * @param object
        * @return
        */
        public static boolean isBaseType(Field f) {
            System.out.println(f.getType());
            System.out.println(String.class);
            System.out.println(f.getType() == String.class);
            if (f.getType() == Integer.class ||
                f.getType() == Byte.class ||
                f.getType() == Long.class ||
                f.getType() == Double.class ||
                f.getType() == String.class ||
                f.getType() == Float.class ||
                f.getType() == Character.class ||
                f.getType() == Short.class ||
                f.getType() == Boolean.class) {
                return true;
            }
            return false;
        }
    }
    import java.io.IOException;
    import java.io.StringReader;
    import java.io.StringWriter;
    
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.JAXBException;
    import javax.xml.bind.Marshaller;
    import javax.xml.bind.Unmarshaller;
    
    
    public class JaxbUtil {//工具类
    
        /**
         * java对象转换为xml文件
         * @param xmlPath  xml文件路径
         * @param load    java对象.Class
         * @return    xml文件的String
         * @throws JAXBException    
         */
        public static String beanToXml(Object obj, Class<?> load) throws JAXBException {
            JAXBContext context = JAXBContext.newInstance(load);
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false);
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
            StringWriter writer = new StringWriter();
            marshaller.marshal(obj, writer);
            return writer.toString();
        }
    
        /**
         * xml文件配置转换为对象
         * @param xmlPath  xml文件路径
         * @param load    java对象.Class
         * @return    java对象
         * @throws JAXBException    
         * @throws IOException
         */
        @SuppressWarnings("unchecked")
        public static <T> T xmlToBean(String xmlPath, Class<T> load) throws JAXBException, IOException {
            JAXBContext context = JAXBContext.newInstance(load);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            return (T) unmarshaller.unmarshal(new StringReader(xmlPath));
        }
        
        /** 
         * JavaBean转换成xml 
         * 默认编码UTF-8 
         * @param obj 
         * @param writer 
         * @return  
         */
        public static String convertToXml(Object obj) {
            return convertToXml(obj, "UTF-8");
        }
    
        /** 
         * JavaBean转换成xml 
         * @param obj 
         * @param encoding  
         * @return  
         */
        public static String convertToXml(Object obj, String encoding) {
            String result = null;
            try {
                JAXBContext context = JAXBContext.newInstance(obj.getClass());
                Marshaller marshaller = context.createMarshaller();
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
                marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
                marshaller.setListener(new MarshallerListener());
                
                StringWriter writer = new StringWriter();
                marshaller.marshal(obj, writer);
                result = writer.toString();
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return result;
        }
        
        /** 
         * JavaBean转换成xml去除xml声明部分 
         * @param obj 
         * @param encoding  
         * @return  
         */
        public static String convertToXmlIgnoreXmlHead(Object obj, String encoding) {
            String result = null;
            try {
                JAXBContext context = JAXBContext.newInstance(obj.getClass());
                Marshaller marshaller = context.createMarshaller();
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
                marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
                marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
                StringWriter writer = new StringWriter();
                marshaller.marshal(obj, writer);
                result = writer.toString();
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return result;
        }
        
        
        
    
        /** 
         * xml转换成JavaBean 
         * @param xml 
         * @param c 
         * @return 
         */
        @SuppressWarnings("unchecked")
        public static <T> T converyToJavaBean(String xml, Class<T> c) {
            T t = null;
            try {
                JAXBContext context = JAXBContext.newInstance(c);
                Unmarshaller unmarshaller = context.createUnmarshaller();
                t = (T) unmarshaller.unmarshal(new StringReader(xml));
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return t;
        }
    
    }

    生成xml的demo

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.StringReader;
    import java.io.StringWriter;
    
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class XmlUtil {
    
        private final static Logger logger = LoggerFactory.getLogger(MsBusUtil.class);
    
        public final static String msBus_xmlns = "http://MSBUSPlatform/v2.0";
    
        /**
         * Add RequestHead to Request, Invoke, and remove ResponseHead from Response
         * 
         * @param strRequestParam String
         * @param strSvcName      String
         * @param strSvcMethod    String
         * @return String
         * @throws GeneralException
         */
        public static String invokeParam(String strRequestParam, String strSvcID, String keyword) throws DocumentException {
    
            Document doc = DocumentHelper.createDocument();
            Element elmRoot = doc.addElement("ServiceInvoke", MsBusUtil.msBus_xmlns);
            Element elmHead = elmRoot.addElement("RequestHead");
            elmHead.addElement("Requestid").addText(getRequestID(strSvcID));
            elmHead.addElement("Requesttime").addText(DateUtil.getNowStr());
            elmHead.addElement("Sourcesystemid").addText("");
            elmRoot.addElement("Serviceid").addText(strSvcID);
            elmParam.addCDATA(strRequestParam);
            elmRoot.addElement("Keyword").addText(keyword);
    
            String strRequest = StringTranslator.toString(doc, "UTF-8");
            logger.info("invoke Request:" + strRequest);
            return strRequest;
        }
    
        public static String getRequestID(String strSvcID) throws DocumentException {
            RandomGUID randomGUID = new RandomGUID();
            return  strSvcID + "-" + randomGUID.toString();
        }
    
        public static void main(String[] args) throws Throwable {
            UnifiedContentDefineType ucd = new UnifiedContentDefineType();
            ucd.setHead(new HeadType());
            String param = JaxbUtil.convertToXml(ucd, "utf-8");
                    
            String req = invokeParam(param, "PLATFORM-UnifiedImport", "测试一下");
            string2File(req,"F:\归档.xml");
        };
    
        /**
         * 文本文件转换为指定编码的字符串
         * 
         * @param file     文本文件
         * @param encoding 编码类型
         * @return 转换后的字符串
         * @throws IOException
         */
        public static String file2String(File file, String encoding) {
            InputStreamReader reader = null;
            StringWriter writer = new StringWriter();
            try {
                if (encoding == null || "".equals(encoding.trim())) {
                    reader = new InputStreamReader(new FileInputStream(file), encoding);
                } else {
                    reader = new InputStreamReader(new FileInputStream(file));
                }
                // 将输入流写入输出流
                char[] buffer = new char[1024];
                int n = 0;
                while (-1 != (n = reader.read(buffer))) {
                    writer.write(buffer, 0, n);
                }
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            } finally {
                if (reader != null)
                    try {
                        reader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
            }
            return writer.toString();
        }
        
        /** 
         * 将字符串写入指定文件(当指定的父路径中文件夹不存在时,会最大限度去创建,以保证保存成功!) 
         * 
         * @param res            原字符串 
         * @param filePath 文件路径 
         * @return 成功标记 
         */ 
        public static boolean string2File(String res, String filePath) { 
                boolean flag = true; 
                BufferedReader bufferedReader = null; 
                BufferedWriter bufferedWriter = null; 
                try { 
                        File distFile = new File(filePath); 
                        if (!distFile.getParentFile().exists()) distFile.getParentFile().mkdirs(); 
                        bufferedReader = new BufferedReader(new StringReader(res)); 
                        bufferedWriter = new BufferedWriter(new FileWriter(distFile)); 
                        char buf[] = new char[1024];         //字符缓冲区 
                        int len; 
                        while ((len = bufferedReader.read(buf)) != -1) { 
                                bufferedWriter.write(buf, 0, len); 
                        } 
                        bufferedWriter.flush(); 
                        bufferedReader.close(); 
                        bufferedWriter.close(); 
                } catch (IOException e) { 
                        e.printStackTrace(); 
                        flag = false; 
                        return flag; 
                } finally { 
                        if (bufferedReader != null) { 
                                try { 
                                        bufferedReader.close(); 
                                } catch (IOException e) { 
                                        e.printStackTrace(); 
                                } 
                        } 
                } 
                return flag; 
        }
    
    }
  • 相关阅读:
    C#读取Excel日期时间
    软件需求3个层次――业务需求、用户需求和功能需求
    软件开发中的基线
    软件开发过程(CMMI/RUP/XP/MSF)是与非
    第1章项目初始.pdf
    计算机鼓轮
    概念模型,逻辑模型,物理模型
    第0章项目管理概述.pdf
    C#中提供的精准测试程序运行时间的类Stopwatch
    Installing and configuring OpenSSH with pam_ldap for RedHat Enterprise Linux3
  • 原文地址:https://www.cnblogs.com/liangblog/p/12803910.html
Copyright © 2011-2022 走看看