Укажите класс @XmlJavaTypeAdapter через файл привязок? - PullRequest
7 голосов
/ 20 октября 2011

У меня есть сторонний интерфейс, который предоставляет файлы xsd, соответствующие их API. Некоторые из их отображений не совсем Java, обычное логическое значение 0 & 1: - (

Я хотел бы использовать файл привязок, чтобы указать класс @XmlJavaTypeAdapter для моего BooleanAdapter, но пока что не радует.

Файл привязок:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns="http://java.sun.com/xml/ns/jaxws"
    jaxb:extensionBindingPrefixes="xjc" jaxb:version="2.0">
    <jaxb:bindings schemaLocation="GetUserDetailsResponse.xsd" node="/xs:schema" >
        <jaxb:globalBindings underscoreBinding="asWordSeparator" >
            <jaxb:serializable uid="1" />
            <jaxb:javaType name="java.lang.Boolean" xmlType="xs:boolean"
printMethod="mumble.bindings.BooleanAdapter.marshall" 
parseMethod="mumble.bindings.BooleanAdapter.unmarshall" />
        </jaxb:globalBindings>
    </jaxb:bindings>
</jaxb:bindings>

И так как я использую maven соответствующий бит из POM:

<strict>false</strict>
<extension>true</extension>
<verbose>true</verbose>
<enableWrapperStyle>false</enableWrapperStyle>
<enableAsyncMapping>false</enableAsyncMapping>

Я включил enableWrapperStyle без изменений

Я получаю сгенерированный адаптер неправильного типа:

import javax.xml.bind.annotation.adapters.XmlAdapter;
public class Adapter1
    extends XmlAdapter<String, Boolean>{
    public Boolean unmarshal(String value) {
        return (mumble.bindings.BooleanAdapter.unmarshall(value));
    }

    public String marshal(Boolean value) {
        return (mumble.bindings.BooleanAdapter.marshall(value));
    }
}

Есть ли какая-нибудь магия файла привязок, которую я могу использовать, чтобы избавиться от созданной оболочки и напрямую использовать BooleanAdapter?

Ответы [ 2 ]

10 голосов
/ 08 июля 2015

Вам нужно использовать <xjc:javaType> в конфигурации привязки вместо <jaxb:javaType>.Например:

<xjc:javaType name="java.lang.Boolean" xmlType="xs:boolean"
              adapter="mumble.bindings.BooleanAdapter"/>

Я понимаю, что отвечаю на старый вопрос, но у меня недостаточно репутации, чтобы написать комментарий.

3 голосов
/ 25 ноября 2015

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

За mvv , самый простой ответ - перейти на использование xjc:javaType.См. настройка jaxb для получения подробной документации по использованию xjc:javaType.

Вам также потребуется изменить свой настраиваемый адаптер (BooleanAdapter) для реализации интерфейса XmlAdapter.

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

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns="http://java.sun.com/xml/ns/jaxws"
    jaxb:extensionBindingPrefixes="xjc" jaxb:version="2.0">
    <jaxb:bindings schemaLocation="GetUserDetailsResponse.xsd" node="/xs:schema" >
        <jaxb:globalBindings underscoreBinding="asWordSeparator" >
            <jaxb:serializable uid="1" />
            <xjc:javaType name="java.lang.Boolean" xmlType="xs:boolean"
                  adapter="mumble.bindings.BooleanAdapter" />
        </jaxb:globalBindings>
    </jaxb:bindings>
</jaxb:bindings>
...