用ConcurrentMap 对JAXBContext进行缓存,提高效率。
- private static ConcurrentMap<Class<?>,JAXBContext> jaxbContexts = new ConcurrentHashMap<Class<?>,JAXBContext>();
- /**
- * 把xml转换成对应的bean
- *
- * @param <T>
- * @param clazz
- * @param xml
- * @return
- */
- public static <T> T parseXml2Bean(Class<T> clazz,String xml) {
- if (StringUtils.isBlank(xml)) {
- return null;
- }
- try {
- StringReader reader = new StringReader(xml);
- return clazz.cast(createUnmarshaller(clazz).unmarshal(reader));
- } catch (JAXBException e) {
- throw new RuntimeException("Could not parse xml to class [" + clazz + "]: " + e.getMessage(),e);
- }
- }
- /**
- * 把bean转换成对应的xml
- *
- * @param obj
- * @return
- */
- public static String parseBean2Xml(Object obj) {
- return parseBean2Xml(obj,null,false);
- }
- /**
- * 是否省略xml头信息
- *
- * @param obj
- * @param encoding
- * 编码格式
- * @param bool
- * 是否省略xml头信息
- * @return
- */
- public static String parseBean2Xml(Object obj,String encoding,boolean bool) {
- if (obj == null) {
- return null;
- }
- try {
- ByteArrayOutputStream os = new ByteArrayOutputStream();
- createMarshaller(obj.getClass(),encoding,bool).marshal(obj,os);
- return os.toString("UTF-8");
- } catch (JAXBException e) {
- throw new RuntimeException("Could not parse [" + obj + "] to xml " + e.getMessage(),e);
- } catch (UnsupportedEncodingException e) {
- throw new RuntimeException(e.getMessage(),e);
- }
- }
- /**
- * 创建Marshaller并设定encoding(可为null). <br/>
- * 线程不安全,需要每次创建或pooling。
- */
- private static Marshaller createMarshaller(Class<?> clazz,boolean bool) {
- try {
- JAXBContext jaxbContext = getJaxbContext(clazz);
- Marshaller marshaller = jaxbContext.createMarshaller();
- marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE);// 是否格式化生成的xml串
- marshaller.setProperty(Marshaller.JAXB_FRAGMENT,bool);// 是否省略xml头信息
- if (StringUtils.isNotBlank(encoding)) {
- marshaller.setProperty(Marshaller.JAXB_ENCODING,encoding);
- }
- return marshaller;
- } catch (JAXBException e) {
- throw new RuntimeException("Could not createMarshaller for class [" + clazz + "]: " + e.getMessage(),e);
- }
- }
- /**
- * 创建UnMarshaller. <br/>
- * 线程不安全,需要每次创建或pooling。
- */
- private static Unmarshaller createUnmarshaller(Class<?> clazz) {
- try {
- JAXBContext jaxbContext = getJaxbContext(clazz);
- return jaxbContext.createUnmarshaller();
- } catch (JAXBException e) {
- throw new RuntimeException("Could not createUnmarshaller for class [" + clazz + "]: " + e.getMessage(),e);
- }
- }
- /**
- * 维护jaxbContexts
- */
- private static JAXBContext getJaxbContext(Class<?> clazz) {
- Validate.notNull(clazz,"'clazz' must not be null");
- JAXBContext jaxbContext = jaxbContexts.get(clazz);
- try {
- if (jaxbContext == null) {
- jaxbContext = JAXBContext.newInstance(clazz);
- JAXBContext j = jaxbContexts.putIfAbsent(clazz,jaxbContext);
- if (j != null) {
- jaxbContext = j;
- }
- }
- } catch (JAXBException e) {
- throw new RuntimeException(
- "Could not instantiate JAXBContext for class [" + clazz + "]: " + e.getMessage(),e);
- }
- return jaxbContext;
- }