2017-02-27 2 views
8

Ich habe große Probleme, während ich einige Elemente mit CDATA mit jaxb2marshaller in XML umwandele. Ich habe durch die Lösungen wie weg:CDATA über org.springframework.oxm anhängen jaxb2marshaller

JAXB Marshalling Unmarshalling with CDATA

How to generate CDATA block using JAXB?

und vieles mehr, konnte aber nicht eine richtige Lösung finden. Sie sagen entweder, auf alte JAXB-Implementierung zu wechseln oder MOXY zu verwenden. Aber das ist nicht meine Anforderung. Ich habe unter Verwendung der OXM-Bibliothek zwei Klassen implementiert und möchte XML generieren, wo nur wenige Elemente an CDATA angehängt werden müssen.

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; 
    } 
} 

und

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 Hauptklasse:

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); 

} 
} 

und eine einfache POJO-Klasse mit Getter und Setter die XML zu erzeugen.

Kann ich irgendwo oben Änderungen vornehmen, um das XML mit dem erforderlichen CDATA-Attribut zu erzeugen?

HINWEIS: Ich habe bereits EclipseLink Moxy (@XmlData) ausprobiert und es ist nicht mit OXM integriert. Ich möchte dies implementieren, ohne ein Drittanbieter-Jar in meinem Code zu verwenden.

Antwort

4

Gefunden die Lösung mit Moxy-Integration (konnte nicht anders herum finden), hier posten, wenn es jemand in Not hilft.

importiert moxy Abhängigkeit und hinzugefügt jaxb.properties Datei im selben Paket, wo Bean mit der folgenden Zeile erstellt:

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

und setzten @XmlCDATA Anmerkung auf dem gewünschten Feld. Dies erzeugte die XML-Datei mit CDATA-Abschnitten.