Добавить 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.

Другие вопросы по тегам