Корневой элемент JAXB получает тип во время сортировки - PullRequest
0 голосов
/ 17 октября 2018

Ранее я задавал вопрос о маршаллинге элемента jdom.Я никогда не получал это работать, поэтому я переключился на использование объекта Java вместо этого.Это позволило мне почти заставить мою программу работать.Однако я сталкиваюсь с последним препятствием.

Итак, в этом классе я пытаюсь выполнить маршалинг. У меня есть следующее поле:

@XmlRootElement(name = "ReportElement")
class ReportElement{

    More fields....

    @XmlElement(name = "Content", namespace = "some:name:space:1")
    Object content
}

Для содержимого будет задан класс, который имеет следующий корневой элемент:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ContentInfoType", propOrder = [
    order here
])
@XmlRootElement(name = "ContentInfo", namespace = "some:name:space:2")
class ContentInfoType implements ReportProperty {

Маршал все, как я хочу, кроме этого бита:

<ns5:Content xsi:type="ns2:ContentInfoType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

Все поля ContentInfoType установлены правильно, но я не понимаю, почему мой корневой элемент ContentInfoType не устанавливаетсякак XML-узел, подобный следующему:

<ns2:ContentInfo></ContentInfo>

Вот мой код сортировки:

 static <T> Element serializeGenericObjectToXmlTypeElement(T object, boolean removeDeclaration = false, List<String> objectList = []) {
        JAXBContext jc
        if(objectList.size() != 0){
            String packageString = object.getClass().getPackage().getName()
            for(String s : objectList){
                packageString += ":" + s
            }
            jc = JAXBContext.newInstance(packageString)
        } else{
            jc = JAXBContext.newInstance(object.getClass())
        }
        Marshaller marshaller = jc.createMarshaller()

        if (removeDeclaration) {
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true)
        }

        Writer writer = new StringWriter()
        marshaller.marshal(object, writer)
        def xmlString = writer.toString()
        def stringReader = new StringReader(xmlString)
        def builder = new SAXBuilder()
        def doc = builder.build(stringReader)
        def elem = doc.getRootElement()
        MyXMLFormatter xmlFormatter = new MyXMLFormatter(elem)
        Element element2 = xmlFormatter.formatXml(elem)
        return element2
    }

Всякий раз, когда мне нужно упорядочить более одного класса, я отправляю список с именами пакетов:классы, которые необходимо упорядочить.

Вы можете игнорировать MyXMLFormatter.Это уже на

marshaller.marshal(object, writer)

То, что вывод не то, что я желаю.

Кто-нибудь есть какие-либо идеи о том, почему поведение такое, как оно есть?

PS: Если я маршал ContentInfoType один (у меня есть сценарий, где мне нужен только XML этого), он работает нормально, и я получаю элемент XML с ContentInfo.Но когда ContentInfoType устанавливается в «Содержимое объекта», из моего класса ReportElement это не работает.

РЕДАКТИРОВАТЬ: я только что сделал редактирование, так как я не получил все аннотации моего класса contentinfotype.Возможно, причина этого в аннотации @XmlType.

...