All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
com.yqjr.framework.component.mapper.JaxbMapper Maven / Gradle / Ivy
/**
* Copyright (c) 2005-2012 springside.org.cn
*/
package com.yqjr.framework.component.mapper;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.namespace.QName;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.converter.HttpMessageConversionException;
import org.springframework.util.Assert;
import com.yqjr.framework.datatype.BizzException;
import com.yqjr.framework.utils.Reflections;
/**
* 使用Jaxb2.0实现XML-Java Object的Mapper.
*
* 在创建时需要设定所有需要序列化的Root对象的Class. 特别支持Root对象是Collection的情形.
*
* @author calvin
* @version 2013-01-15
*/
@SuppressWarnings("rawtypes")
public class JaxbMapper {
private static ConcurrentMap jaxbContexts = new ConcurrentHashMap();
/**
* Java Object-Xml without encoding.
* @param root Object
* @return String
*/
public static String toXml(Object root) {
Class clazz = Reflections.getUserClass(root);
return toXml(root, clazz, null);
}
/**
* Java Object-Xml with encoding.
* @param root Object
* @param encoding String
* @return String
*/
public static String toXml(Object root, String encoding) {
Class clazz = Reflections.getUserClass(root);
return toXml(root, clazz, encoding);
}
/**
* Java Object-Xml with encoding.
* @param root Object
* @param clazz Class
* @param encoding String
* @return String
*/
public static String toXml(Object root, Class clazz, String encoding) {
try {
StringWriter writer = new StringWriter();
createMarshaller(clazz, encoding).marshal(root, writer);
return writer.toString();
} catch (JAXBException e) {
throw new BizzException(e);
}
}
/**
* Java Collection-Xml without encoding, 特别支持Root Element是Collection的情形.
* @param root Collection
* @param rootName String
* @param clazz Class
* @return String
*/
public static String toXml(Collection root, String rootName, Class clazz) {
return toXml(root, rootName, clazz, null);
}
/**
* Java Collection-Xml with encoding, 特别支持Root Element是Collection的情形.
* @param root Collection
* @param rootName String
* @param clazz Class
* @param encoding String
* @return String
*/
public static String toXml(Collection root, String rootName, Class clazz, String encoding) {
try {
CollectionWrapper wrapper = new CollectionWrapper();
wrapper.collection = root;
JAXBElement wrapperElement = new JAXBElement(new QName(rootName),
CollectionWrapper.class, wrapper);
StringWriter writer = new StringWriter();
createMarshaller(clazz, encoding).marshal(wrapperElement, writer);
return writer.toString();
} catch (JAXBException e) {
throw new BizzException(e);
}
}
/**
* Xml-Java Object.
* @param xml String
* @param clazz Class
* @param 返回T
* @return 返回数据
*/
@SuppressWarnings("unchecked")
public static T fromXml(String xml, Class clazz) {
try {
StringReader reader = new StringReader(xml);
return (T) createUnmarshaller(clazz).unmarshal(reader);
} catch (JAXBException e) {
throw new BizzException(e);
}
}
/**
* 创建Marshaller并设定encoding(可为null). 线程不安全,需要每次创建或pooling。
* @param clazz Class
* @param encoding String
* @return Marshaller
*/
public static Marshaller createMarshaller(Class clazz, String encoding) {
try {
JAXBContext jaxbContext = getJaxbContext(clazz);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
if (StringUtils.isNotBlank(encoding)) {
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
}
return marshaller;
} catch (JAXBException e) {
throw new BizzException(e);
}
}
/**
* 创建UnMarshaller. 线程不安全,需要每次创建或pooling。
* @param clazz Class
* @return Unmarshaller
*/
public static Unmarshaller createUnmarshaller(Class clazz) {
try {
JAXBContext jaxbContext = getJaxbContext(clazz);
return jaxbContext.createUnmarshaller();
} catch (JAXBException e) {
throw new BizzException(e);
}
}
protected static JAXBContext getJaxbContext(Class clazz) {
Assert.notNull(clazz, "'clazz' must not be null");
JAXBContext jaxbContext = jaxbContexts.get(clazz);
if (jaxbContext == null) {
try {
jaxbContext = JAXBContext.newInstance(clazz, CollectionWrapper.class);
jaxbContexts.putIfAbsent(clazz, jaxbContext);
} catch (JAXBException ex) {
throw new HttpMessageConversionException(
"Could not instantiate JAXBContext for class [" + clazz + "]: " + ex.getMessage(), ex);
}
}
return jaxbContext;
}
/**
* 封装Root Element 是 Collection的情况.
*/
public static class CollectionWrapper {
@XmlAnyElement
protected Collection collection;
}
}