Add CDATA using org.springframework.oxm jaxb2marshaller

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.

+8
java spring spring-boot marshalling jaxb2-maven-plugin
source share
1 answer

I found a solution with moxy integration (I could not find another way), posting it here if it helps someone to need it.

the imported moxy dependency and the added jaxb.properties file in the same package where the bean is created with the following line:

 javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

and put the @XmlCDATA annotation in the required field. This generated an XML file with CDATA partitions.

+4
source share

All Articles