2011-10-20 7 views
7

Mam zewnętrzny interfejs dostarczający pliki xsd pasujące do ich API. Niektóre z ich odwzorowań nie są dość Java, zwykle jako logiczna 0 & 1 :-(Podaj klasę @XmlJavaTypeAdapter w pliku powiązań?

Chciałbym użyć pliku powiązań określić klasę @XmlJavaTypeAdapter dla mojego BooleanAdapter, ale jak dotąd nie ma radości.

złożyć

wiązania:

<?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> 

A ponieważ Używam Maven odpowiedniego bitu z POM:

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

mam przełączać między opcjami enableWrapperS tyle i żadna zmiana

Co kończę-up z generowany Adapter z niewłaściwego typu:

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)); 
    } 
} 

Czy istnieją jakieś powiązania złożyć magii mogę używać, aby pozbyć wygenerowanego opakowania i użyj BooleanAdapter bezpośrednio?

+0

Mogą pomóc: http://blog.bdoughan.com/2011/08/xml-schema-to-java-generating.html –

+0

Nie, już na to patrzyłem, nie tego chcę. Prawdopodobnie mógłbym żyć z Adapter1, gdybym mógł wymusić na nim konwersję int <--> boolean, a nie string bo <--> boolean, ale niepotrzebna dodatkowa warstwa Adaptera ostatecznie by mnie zirytowała. Dzięki. –

+2

zobacz: http://adventuresintechology.blogspot.ca/2012/04/binding-custom-xmljavatypeadapter-to.html. Byłem w stanie zaimplementować dokładnie to, o co prosisz, korzystając z tego posta. –

Odpowiedz

10

Musisz użyć <xjc:javaType> w konfiguracji wiązania zamiast <jaxb:javaType>. Na przykład:

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

Rozumiem ja odpowiadając na stare pytanie, ale nie mam wystarczająco dużo reputacji, aby napisać komentarz.

+0

'Rozumiem, że odpowiadam na stare pytanie, ale nie mam wystarczającej reputacji, aby napisać komentarz. I tak nie powinno się odpowiadać w komentarzach! :) –

+0

nie działa: https://stackoverflow.com/questions/46037803/why-jaxb-adapter-annotation-is-not-added-to-the-proxy-classes – grep

3

To bardzo późna reakcja, zdaję sobie sprawę, ale nawet odpowiedź mvv zmusiła mnie do całkowitego uchwycenia tego, co robię i gdzie w strukturze pasuje nowy element, więc chciałem dodać więcej szczegółów dla każdego natknąć się na to później.

Na mvv, najprostszą odpowiedzią jest zmiana na używanie xjc:javaType. Szczegółowe informacje na temat korzystania z xjc:javaType można znaleźć w dokumencie jaxb customization.

Konieczna będzie również zmiana niestandardowego adaptera (BooleanAdapter) w celu implementacji interfejsu XmlAdapter.

Ostatecznie swój wiążący będzie zamiast wyglądać następująco:

<?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: Czy wiesz przez przypadek jak mieć adapter do ustawiania i usuwania dla java.util.List? Zwróć uwagę, że akceptuje xmlType = "xyz", a "listy" w schemacie są reprezentowane przez parametr maxOccurance = unbounded, a nie rzeczywisty typ schematu. – Malvon

+0

hm .. nie działa: https://stackoverflow.com/questions/46037803/why-jaxb-adapter-annotation-is-not-added-to-the-proxy-classes – grep