Добавить CDATA с помощью org.springframework.oxm jaxb2marshaller
У меня большие проблемы при маршалинге нескольких элементов в XML с CDATA с использованием jaxb2marshaller. Я прошел через такие решения, как:
JAXB Marshalling Unmarshalling с CDATA
Как сгенерировать блок CDATA с помощью JAXB?
и многое другое, но не смог найти правильного решения. Они либо говорят переключиться на старую реализацию JAXB, либо используют MOXY. Но это не мое требование. Ниже я реализовал два класса, используя библиотеку OXM, и хочу сгенерировать XML, к которому нужно добавить несколько элементов CDATA.
import java.util.HashMap;
import java.util.Map;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
@Configuration
public class AppConfig {
@Bean
public Processor getHandler(){
Processor handler= new Processor();
handler.setMarshaller(getCastorMarshaller());
handler.setUnmarshaller(getCastorMarshaller());
return handler;
}
@Bean
public Jaxb2Marshaller getCastorMarshaller() {
Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
jaxb2Marshaller.setPackagesToScan("com.pom.dom.whatever.model");
Map<String,Object> map = new HashMap<String,Object>();
map.put("jaxb.formatted.output", true);
jaxb2Marshaller.setMarshallerProperties(map);
return jaxb2Marshaller;
}
}
а также
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.springframework.oxm.Marshaller;
import org.springframework.oxm.Unmarshaller;
public class Processor {
private Marshaller marshaller;
private Unmarshaller unmarshalling;
public void setMarshaller(Marshaller marshaller) {
this.marshaller = marshaller;
}
public void setUnmarshaller(Unmarshaller unmarshalling) {
this.unmarshaller = unmarshaller;
}
//Converts Object to XML file
public void objectToXML(String fileName, Object graph) throws IOException {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(fileName);
marshaller.marshal(graph, new StreamResult(fos));
} finally {
fos.close();
}
}
//Converts XML to Java Object
public Object xmlToObject(String fileName) throws IOException {
FileInputStream fis = null;
try {
fis = new FileInputStream(fileName);
return unmarshaller.unmarshal(new StreamSource(fis));
} finally {
fis.close();
}
}
}
В основном классе:
generateXML(){
public void generateCheckXML(ReportDTO repDTO, String fileName){
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(AppConfig.class);
ctx.refresh();
Processor processor = ctx.getBean(Processor.class);
ObjectFactory objectFactory = new ObjectFactory();
TRIMSInterface trimsInterface = objectFactory.createTRIMSInterface();
// setters
processor.objectToXML(fileName,trimsInterface);
}
}
и простой класс POJO с сеттерами и геттерами для создания XML.
Могу ли я внести некоторые изменения где-нибудь выше, чтобы получить XML с обязательным атрибутом CDATA?
ПРИМЕЧАНИЕ. Я уже пробовал EclipseLink Moxy(@XmlData), и он не интегрируется с OXM. Я ищу, чтобы реализовать это без использования стороннего JAR в моем коде.
1 ответ
Нашел решение с интеграцией moxy (не смог найти другого выхода), разместив здесь, если это поможет кому-то нуждающемуся.
импортированная зависимость от moxy и добавленный файл jaxb.properties в том же пакете, где создается bean-компонент со следующей строкой:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
и положи @XmlCDATA
аннотация на обязательном поле. Это создало XML-файл с разделами CDATA.