При создании и обращении к веб-сервисам в большинстве случаем мы можем забыть и не знать о маршалинге и анмаршалинге (демаршалинге). Но бывают интеграции, где каким-то текстовым полем передается XML-ка. Вот тут нужно с одной стороны уметь делать маршалинг, а с другой анмаршалинг. Предлагаю набор методов для проведения данных операций:
import javax.xml.bind.*;
import java.io.File;
import java.io.StringReader;
import java.io.StringWriter;
/**
* Набор методов для маршалинга и анмаршалинга
*/
public class XmlUtils {
/**
* Маршалинг в строку
* @param t объект
* @param тип объекта
* @return XML в виде строки
* @throws JAXBException
*/
public static String marshalRoot(T t) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(t.getClass());
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
StringWriter sw = new StringWriter();
marshaller.marshal(t,sw);
return sw.toString();
}
/**
* Маршалинг в файл
* @param t объект
* @param file файл
*/
public static void marshalRoot(T t,File file){
marshal(t,file,false);
}
/**
* Маршалинг в файл с возможностью вывода в консоль
* @param t объект
* @param file файл
* @param isAddToLog делать вывод в консоль или нет
*/
public static void marshal(T t,File file,boolean isAddToLog){
String filePath = file.getAbsolutePath();
try {
JAXBContext jaxbContext = JAXBContext.newInstance(t.getClass());
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
marshaller.marshal(t,file);
if(isAddToLog){
marshaller.marshal(t,System.out);
}
} catch (JAXBException e) {
System.out.println("Не удалось сбросить xml в файл: " + filePath);
e.printStackTrace();
}
System.out.println("Xml saved to: " + filePath);
}
/**
* Анмаршалинг (Демаршалинг) XML в объект
* @param xml входной XML
* @param _class класс объекта, который ходит получить
* @return объект
* @throws JAXBException
*/
@SuppressWarnings("unchecked")
public static T unmarshall(String xml,Class _class) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(_class);
Unmarshaller unmarshaller = context.createUnmarshaller();
JAXBElement element = (JAXBElement)unmarshaller.unmarshal(new StringReader(xml));
return element.getValue();
}
/**
* Анмаршалинг XML root-элемента (@XmlRootElement) в объект
* @param xml входной XML
* @param _class класс объекта, который ходит получить
* @return объект
* @throws JAXBException
*/
@SuppressWarnings("unchecked")
public static T unmarshallRoot(String xml,Class _class) throws JAXBException{
JAXBContext context = JAXBContext.newInstance(_class);
Unmarshaller unmarshaller = context.createUnmarshaller();
return (T)unmarshaller.unmarshal(new StringReader(xml));
}
}