I'm having big problems while simultaneously marking multiple XML elements with CDATA using jaxb2marshaller. I reviewed solutions such as:
JAXB Marshalling Unmarshalling with CDATA
How to generate a CDATA block using JAXB?
and much more, but could not find the right solution. They either say upgrade to the old JAXB implementation, or use MOXY. But this is not my requirement. I have implemented below two classes using the OXM library and want to generate XML where several elements must have 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; } }
and
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(); } } }
In the main class:
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); } }
and a simple POJO class with setters and getters for creating XML.
Can I make some changes anywhere above to create XML with the required CDATA attribute?
NOTE I already tried EclipseLink Moxy (@XmlData) and does not integrate with OXM. I want to implement this without using a third-party banner in my code.
java spring spring-boot marshalling jaxb2-maven-plugin
ani0710
source share