2011-10-20 2 views
7

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

Я хотел бы использовать файл привязок, чтобы указать класс @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> 

Я переключены enableWrapperS мозоль и никаких изменений

Что я заканчиваю-вверх с генерируемой Adapter неправильного типа:

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 напрямую?

+0

Следующие действия могут помочь: http://blog.bdoughan.com/2011/08/xml-schema-to-java-generating.html –

+0

Нет, я уже посмотрел на это, это не то, что я хочу. Вероятно, я мог бы жить с Adapter1, если бы мог заставить его преобразовать int <--> boolean, а не строку <--> boolean, но лишний дополнительный слой Adapter в конечном итоге раздражал бы меня. Благодарю. –

+2

см. Это: http://adventuresintechology.blogspot.ca/2012/04/binding-custom-xmljavatypeadapter-to.html. Я смог реализовать именно то, что вы просите здесь, с помощью этого сообщения. –

ответ

10

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

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

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

+0

'Я понимаю, что я отвечаю на старый вопрос, но у меня недостаточно репутации, чтобы написать комментарий.« Вы не должны отвечать в комментариях в любом случае! :) –

+0

не работает: https://stackoverflow.com/questions/46037803/why-jaxb-adapter-annotation-is-not-added-to-the-proxy-classes – grep

3

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

За mvv самый простой ответ - перейти на использование xjc:javaType. См. jaxb customization для получения подробной документации по использованию 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> 
+0

jenrmagas: Знаете ли вы, что можете для того, чтобы адаптер сделал сортировку и разборку для java.util.List? Обратите внимание: принимает xmlType = "xyz", а "списки" в схеме представлены с maxOccurance = неограниченным, а не с фактическим типом схемы. – Malvon

+0

hm .. не работает: https://stackoverflow.com/questions/46037803/why-jaxb-adapter-annotation-is-not-added-to-the-proxy-classes – grep

Смежные вопросы