2009-12-10 12 views
17

Mam istniejący schemat XML, który zawiera typ, który chciałbym mapować do Java Map jakiegoś rodzaju przy użyciu JAXB. Mój proces kompilacji przyjmuje schemat i tworzy fasolę. Chciałbym spersonalizować ten proces, używając jednego ze złożonych typów w mojej mapie schematu do pliku java.util.Map. Czytałem gdzieś, że JAXB "nie może tworzyć interfejsów". Nie jestem pewien, czy to ma zastosowanie w tym przypadku, ale jeśli tak, to byłoby dobrze z mapowaniem do HashMap. Ponadto niekoniecznie musi to być complexType, który mapuje do mapy, może to być element, jeśli jest to wymagane.Czy można użyć JAXB do odwzorowania ze schematu na java.util.Map?

Kontroluję moją generację JAXB przy użyciu pliku .xjb, więc szukam jakiegoś <jaxb:bindings>, aby go tam umieścić. Próbowałem następujących, ale nie działa:

<jaxb:bindings schemaLocation="myschema.xsd" node="/xs:schema"> 
    <jaxb:globalBindings> 
     <jaxb:serializable uid="1"/> 
    </jaxb:globalBindings> 
    <jaxb:schemaBindings> 
     <jaxb:package name="com.myschema.client.types"/> 
    </jaxb:schemaBindings> 
    <jaxb:bindings node="//xs:complexType[@name='MapType']"> 
      <jaxb:javaType name="java.util.HashMap" 
      parseMethod="com.myschema.common.MapConverter.parseObjectToMap" 
      printMethod="com.myschema.common.MapConverter.printMapToObject" /> 
    </jaxb:bindings> 
</jaxb:bindings> 

Edit: Dodałem więcej szczegółów na powyższe wiążące że ja już próbowałem. Generuje następujący błąd podczas kompilacji schematu:

[jaxb] [ERROR] compiler was unable to honor this javaType customization. It is attached to a wrong place, or its inconsistent with other bindings. 

<jaxb:javaType> nie będzie działać, ponieważ może on być stosowany tylko dla mapping between XML Schema primitives and Java types. Ponieważ chcę mapować między typem złożonym a typem Java, nie mogę tego użyć.

+0

Twoje podejście ".xjb" jest poprawne i powinno działać. Czy XJC po prostu go ignoruje, czy też generuje coś niewłaściwego? – skaffman

+0

Korzystając z powyższej metody .xjb, pojawia się następujący błąd w kompilacji jaxb: [JEXB] [ERROR] kompilator nie był w stanie uhonorować tego dostosowania javaType. Jest on przymocowany do niewłaściwego miejsca lub niezgodny z innymi powiązaniami. – Zach

Odpowiedz

10

Twój plik XJC używa "standardowej" dyrektywy javaType, która moim zdaniem ogranicza się do konwersji wartości String do iz reprezentatywnego typu java. W związku z tym nadaje się tylko do konwersji prostych elementów i atrybutów.

Narzędzie XJC udostępnia ulepszoną wersję javaType, która teoretycznie powinna być w stanie obsłużyć bardziej złożone struktury. Niestety, ten musi jeszcze zostać wdrożone:

https://java.net/jira/browse/JAXB-209 (nierozwiązany)

Na przykład, będąc w stanie odwzorować typ schematu do HashMap może być prawdopodobne wymaganie dla osób korzystających Model Driven Design /realizacja. AFAICS, dziś nie jest to możliwe. Dlatego należy ręcznie edytować wygenerowany kod .

Wygląda na to, że nie masz szczęścia.

+0

Miałem nadzieję, że to nie będzie odpowiedź, ale ja " Cieszę się, że wiem, że niczego nie brakuje. – Zach

6

Czy spojrzał na przykład tutaj (Dostosowane mapowanie HashMap): http://java.sun.com/javase/6/docs/api/javax/xml/bind/annotation/adapters/XmlAdapter.html

Trzeba utworzyć niestandardową XmlAdapter obawiam się.

+1

Hej, to wygląda całkiem blisko tego, co chcę zrobić! Jedyną rzeczą jest to, że używam schematu do generowania typów Java (w ramach mojego procesu kompilacji). Nie mam nic przeciwko zapisywaniu adaptera, ale chciałbym uniknąć uprzedniego zaimplementowania klasy, która generuje schemat (MyHashMapType i MyHashMapEntryType w połączonym przykładzie), ponieważ cofa się to dla mnie. czy to możliwe? – Zach

+0

Nie uważam tego za absolutnie konieczne, najprawdopodobniej jest to tylko rozszerzony przykład. Wiem, że zrobiliśmy to w przeszłości tylko ze schematem, wiążącym plikiem dostosowywania i adapterem. – maximdim

+0

Brzmi jak JSON ... – duffymo

Powiązane problemy