MOXy упорядочивает неправильный объект

Я пытаюсь, чтобы docx4j поддерживал MOXy в качестве реализации JAXB.

Мы в значительной степени там; см. docx4j и MOXy

У меня проблема в том, что у меня есть класс:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = "http://schemas.openxmlformats.org/wordprocessingml/2006/main", name = "CT_Text", propOrder = {
    "value"
})
@XmlRootElement(name = "t")
public class Text

MOXy упорядочивает это в w:delInstrText вместо w:t, чего я ожидал/надеялся, и что делают эталонные реализации Java 6/.

Из схемы:

        <xsd:element name="t" type="CT_Text">
            <xsd:annotation>
                <xsd:documentation>Text</xsd:documentation>
            </xsd:annotation>
        </xsd:element>

        <xsd:element name="delInstrText" type="CT_Text">
            <xsd:annotation>
                <xsd:documentation>Deleted Field Code</xsd:documentation>
            </xsd:annotation>
        </xsd:element>

FWIW, ObjectFactory содержит:

public Text createText() {
    return new Text();
}

@XmlElementDecl(namespace = "http://schemas.openxmlformats.org/wordprocessingml/2006/main", name = "delInstrText", scope = R.class)
public JAXBElement<Text> createRDelInstrText(Text value) {
    return new JAXBElement<Text>(_RDelInstrText_QNAME, Text.class, R.class, value);
}

Это с банками MOXy:

        +- org.eclipse.persistence:org.eclipse.persistence.moxy:jar:2.4.1
        |  +- org.eclipse.persistence:org.eclipse.persistence.core:jar:2.4.1
        |  |  \- org.eclipse.persistence:org.eclipse.persistence.asm:jar:3.3.1.v201206041142
        |  \- org.eclipse.persistence:org.eclipse.persistence.antlr:jar:3.2.0.v201206041011             

Обновление:

Вот тестовый пример:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;

import org.docx4j.wml.R;
import org.docx4j.wml.Text;


public class MOXyTest {

    public static void main(String[] args) throws Exception {


        JAXBContext jc = JAXBContext.newInstance("org.docx4j.wml");
//        System.out.println(Version.getVersion());
//        System.out.println(jc.getClass());

        R run = new R();
        Text text = new Text();
        run.getContent().add(text);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(run, System.out);

    }
}

person JasonPlutext    schedule 06.11.2012    source источник


Ответы (1)


Примечание. Я EclipseLink JAXB (MOXy) руководитель и член JAXB (JSR-222) группа экспертов.


ОБНОВЛЕНИЕ

Нам удалось воспроизвести ошибку, которую вы видите в EclipseLink 2.4.1. Нам не удалось воспроизвести проблему в потоках EclipseLink 2.4.2 или 2.5.0. Я бы порекомендовал скачать последнюю ночную сборку 2.4.2 и попробовать ее:

Мы все еще изучаем эту проблему, чтобы убедиться, что она действительно исправлена.


ИСХОДНЫЙ ОТВЕТ

До сих пор мне не удалось воспроизвести результаты вашего вопроса, когда MOXy используется в качестве поставщика JAXB. Не могли бы вы предоставить дополнительную информацию, которая поможет мне воспроизвести ваш вариант использования. Ниже приведено то, что я пробовал до сих пор:

Модель Java

Я взял модель Java из следующего места на GitHub:

jaxb.properties

Я добавил файл с именем jaxb.properties в пакет org.docx4j.wml, чтобы включить MOXy в качестве провайдера JAXB.

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

Демо

Ниже приведен демонстрационный код, который я использовал, чтобы попытаться воспроизвести проблему:

package org.docx4j.wml;

import javax.xml.bind.*;
import org.eclipse.persistence.Version;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance("org.docx4j.wml");
        System.out.println(Version.getVersion());
        System.out.println(jc.getClass());

        Text text = new Text();

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(text, System.out);
    }

}

Вывод

Ниже приведен результат запуска демонстрационного кода. Я вижу правильный корневой элемент t вместо delInstrText, как описано в вопросе.

2.4.1
class org.eclipse.persistence.jaxb.JAXBContext
<?xml version="1.0" encoding="UTF-8"?>
<ns0:t xmlns:ns2="http://schemas.openxmlformats.org/schemaLibrary/2006/main" xmlns:ns1="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:ns4="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:ns3="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:ns0="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:ns5="http://schemas.openxmlformats.org/officeDocument/2006/relationships"/>
person bdoughan    schedule 06.11.2012
comment
Я обновил вопрос, добавив вариант вашего демонстрационного кода, который воспроизводит проблему. Спасибо! - person JasonPlutext; 07.11.2012
comment
@JasonPlutext - Спасибо за обновление вашего вопроса. Я обновил свой ответ нашими выводами. - person bdoughan; 07.11.2012
comment
Проверено, что с eclipselink-2.4.2.v20121107 проблема, похоже, исчезла. Спасибо, что изучили это. - person JasonPlutext; 08.11.2012