Проблема с демаршалингом xsd: base64Binary - PullRequest
2 голосов
/ 26 августа 2011

JAXB, сгенерированный из XSD base64Binary и hexBinary в байтовый массив. У меня есть элемент xsd с base64Binary. Это строгое и не может быть изменено. Но в этом элементе у нас есть значение hexBinary (да, немного запутано). А теперь где это проблема. Я не понимаю, как JAXB разрушает эти элементы, но есть что-то, что мне не подходит. Так что, если в моем элементе может быть hexBinary, это верно. Но мой элемент case имеет тип base64Binary и JAXB, демаршируя эти элементы чем-то другим, что не так для меня. Есть ли способ изменить то, как JAXB обрабатывает эти элементы, и сказать ему, чтобы они обрабатывали, так как эти элементы были бы hexBinary. может быть, запутанный вопрос, но мне нужна помощь с этим.

так что в скором времени у меня есть элемент base64Binary, но я хочу сказать JAXB о демаршалинге, так как это будет hexBinary

Я прочитал что-то, что мне нужно, чтобы создать новый XmlAdapter, но я не знаю, где его использовать, потому что у меня есть только классы, которые сгенерировали JAXB

UPDATE:

Я нашел, где проблема. когда элемент является base64Binary в сгенерированном классе, он создал это

XmlElement(name="name") protected byte[] element

но когда он является hexBinary, он создает

XmlJavaTypeAdapter(HexBinaryAdapter.class) XmlElement(name="name") protected byte[] element

так что теперь мне нужно знать, как сказать jaxb, чтобы использовать эти адаптеры, когда у меня есть base64Binary
защищенный элемент byte []

1 Ответ

2 голосов
/ 26 августа 2011

ОБНОВЛЕНИЕ

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

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">
    <jxb:bindings schemaLocation="YourSchema.xsd">
        <jxb:bindings node="//xs:element[@name='element']">
            <jxb:property>
                <jxb:baseType>
                    <jxb:javaType name="byte[]"
                        parseMethod="javax.xml.bind.DatatypeConverter.parseHexBinary" 
                        printMethod="javax.xml.bind.DatatypeConverter.printHexBinary"/>
                </jxb:baseType>
            </jxb:property>
        </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>

Существует несколько параметров:

Опция № 1 - @XmlSchemaType

Вы можете использовать аннотацию @XmlSchemaType для управления представлением схемы;

@XmlSchemaType(name="hexBinary")
private byte[] hexBinary;

@XmlSchemaType(name="base64Binary")
private byte[] base64Binary;

Вариант № 2 - XmlAdapter

Если вы хотите сгенерировать модель из схемы XML и использовать вместо этого XmlAdapter, в следующем примере демонстрируется, как онаможно сделать:

...