2012-11-16 30 views
5
<ProductInformation Context="GL"> 
<Assets> 
    <Asset ID="assetID" UserTypeID="ID"> 
    <Name>name</Name> 
    <Reference ClassificationID="id"/> 
     <Values> 
     <Value AttributeID="ID">Value1</Value> 
     <Value AttributeID="ID">Value2</Value> 
      <MultiValue AttributeID="attributeID"> 
      <Value>value3a</Value> 
      <Value>value3b</Value> 
      </MultiValue> 
    </Values> 
    </Asset> 
</Assets> 

<Products>....</Products> 

</ProductInformation> 

Użyłem tego xml-> xsd i xjc, aby utworzyć z niego klasy.marshall z XJC utworzone klasy zagnieżdżone

Teraz chcę utworzyć obiekt ProductInformation i przygotować go.

Mój problem polega na tym, że Xjc tworzy 3 klasy i obiekty obiektowe oraz niektóre klasy zagnieżdżone wewnątrz ProductInformation. Kiedy patrzę na dostępne metody, najczęściej widzę, jak pobierają zamiast ustawiaczy.

Klasa "Asset" nie ma takich metod jak;

asset.setValues(List<Value> values) 

Również skończyłem pisanie zabawnego kodu w ten sposób;

ProductInformation.Assets.Asset.Values.MultiValue multivalue=new ProductInformation.Assets.Asset.Values.MultiValue(); 

Czy to normalne w przypadku Jaxb?

+0

można dodawać poszczególne części wygenerowanego kodu, który powoduje problemy? Zwykle wszystko powinno działać dobrze ... – Puce

Odpowiedz

5

Sposób, w jaki JAXB normalnie obsługuje właściwości o wielu wartościach, to dostarczenie tylko pobierającego i nie ustawiającego dla List<Whatever>, który zwraca zmienną listę - powinieneś nazwać gettera, aby pobrać początkowo pustą listę, a następnie utworzyć obiekty członkowskie dla tej listy używające new w zwykły sposób i add je bezpośrednio do listy. Możesz new statyczną klasę zagnieżdżoną w dokładnie taki sam sposób, jak w przypadku najwyższego poziomu.

Właściwości jednowartościowe (bez list) powinny zostać wygenerowane zarówno z programem pobierającym, jak i ustawiającym.

+0

Dzięki! Sprawdzę to, zaktualizowałem pytanie, czy możesz sprawdzić – Spring

+0

, więc nie jest dziwne, że moja klasa zasobów jest wewnętrznie statyczna wewnątrz ProductInfo? – Spring

+0

@Spring Tak, ten zrzut ekranu wygląda poprawnie, to jest to, co domyślnie oczekiwałbym JAXB. –

3

Numer answer given by Ian Roberts jest prawidłowy. Daję to, aby zapewnić dodatkowe informacje dla osób zainteresowanych brakiem wewnętrznych zajęć.

XML Schema (schema.xsd)

Jeśli klas JAXB są generowane na podstawie poniższego schematu XML, zarówno wynikające Customer i Employee zajęcia będą zawierać statyczną zagnieżdżone klasy o nazwie Address (ponieważ każdy zawiera własną definicję adresu). Jest tak dlatego, że statyczne klasy zagnieżdżone są używane w celu uniknięcia problemów z konfliktami nazw.

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema 
    targetNamespace="http://www.example.org/company" 
    xmlns="http://www.example.org/company" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified"> 

    <xsd:element name="customer"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="address"> 
        <xsd:complexType> 
         <xsd:sequence> 
          <xsd:element name="street" type="xsd:string"/> 
         </xsd:sequence> 
        </xsd:complexType> 
       </xsd:element> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 

    <xsd:element name="employee"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="address"> 
        <xsd:complexType> 
         <xsd:sequence> 
          <xsd:element name="road" type="xsd:string"/> 
         </xsd:sequence> 
        </xsd:complexType> 
       </xsd:element> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 

</xsd:schema> 

JAXB Wiązanie plików (binding.xml)

Plik Wiązania służy do dostosowywania schematu na pokolenie Java. Możesz określić, że wszystko powinno być klasą najwyższego poziomu z localScoping="top-level". Gdy to zrobisz, musisz rozwiązać potencjalne konflikty nazw.

<jaxb:bindings 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    version="2.1"> 
    <jaxb:globalBindings localScoping="toplevel"/> 
    <jaxb:bindings schemaLocation="company.xsd"> 
     <jaxb:bindings node="//xsd:element[@name='employee']/xsd:complexType/xsd:sequence/xsd:element[@name='address']/xsd:complexType"> 
      <jaxb:class name="EmployeeAddress"/> 
     </jaxb:bindings> 
    </jaxb:bindings> 
</jaxb:bindings> 

XJC połączeń

Poniżej jest przykład określając plik powiązań przy użyciu polecenia XJC generować klas Java z schematu XML.

xjc -b binding.xml schema.xsd 

Aby uzyskać więcej informacji