2012-11-16 17 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> 

मैंने इस xml-> xsd और xjc का उपयोग कक्षाओं को बनाने के लिए किया था।xjc के साथ marshall नेस्टेड कक्षाएं

अब मैं अपना उत्पाद जानकारी वस्तु बनाना चाहता हूं, और इसे मार्शल करना चाहता हूं।

मेरी समस्या xjc 3 कक्षाएं और ऑब्जेक्टफैक्टरी, और उत्पाद जानकारी के अंदर कुछ घोंसला वाले वर्ग हैं। जब मैं उपलब्ध विधियों को देखता हूं तो मैं ज्यादातर सेटर्स के बजाय गेटर्स देखता हूं।

"संपत्ति" वर्ग में ऐसी कोई विधियां नहीं हैं;

asset.setValues(List<Value> values) 

इसके अलावा मैंने इस तरह मजाकिया कोड लिखना समाप्त कर दिया;

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

क्या यह जैक्सब के साथ सामान्य है?

+0

आप उत्पन्न कोड जो समस्या आ जाती के विशिष्ट भागों पोस्ट कर सकते हैं? आमतौर पर सब ठीक काम करना चाहिए ... – Puce

उत्तर

5

जिस तरह से जेएक्सबी सामान्य रूप से बहु मूल्यवान गुणों को संभालता है, वह List<Whatever> के लिए एक गेटर और कोई सेटटर प्रदान नहीं करता है, जो एक परिवर्तनीय सूची देता है - आपको प्रारंभिक रूप से खाली सूची पुनर्प्राप्त करने के लिए गेटर को कॉल करना होगा और फिर बनाना होगा सामान्य सूची में new का उपयोग करके इस सूची के लिए सदस्य ऑब्जेक्ट्स और add उन्हें सीधे सूची में उपयोग करें। आप new एक स्थाई नेस्टेड क्लास को शीर्ष-स्तर वाले एक ही तरीके से ठीक कर सकते हैं।

एकल मूल्यवान गुण (सूचियां नहीं) दोनों गेटर और सेटर के साथ उत्पन्न किया जाना चाहिए था।

+0

धन्यवाद! मैं इसे देखूंगा, मैंने प्रश्न अपडेट किया है कि आप – Spring

+0

देख सकते हैं, तो यह अजीब बात नहीं है कि मेरा एसेट क्लास ProductInfo के अंदर आंतरिक स्थिर है? – Spring

+0

@ प्रसंस्करण हां, वह स्क्रीन शॉट सही दिखता है, यही वह है जो मैं जेएक्सबी को डिफ़ॉल्ट रूप से उत्पन्न करने की अपेक्षा करता हूं। –

3

answer given by Ian Roberts सही है। मैं इसे उन लोगों के लिए कुछ अतिरिक्त जानकारी प्रदान करने के लिए दे रहा हूं जो आंतरिक कक्षाएं नहीं रखते हैं।

XML स्कीमा (schema.xsd)

JAXB वर्गों निम्नलिखित XML स्कीमा से उत्पन्न कर रहे हैं, दोनों Customer और Employee कक्षाएं जिसके परिणामस्वरूप (एक स्थिर नेस्टेड वर्ग Address कहा जाता है में शामिल होंगे क्योंकि प्रत्येक का अपना स्वयं परिभाषा में शामिल है एक पते का)। वास्तव में नाम संघर्ष समस्याओं से बचने के लिए स्थिर घोंसला वाले वर्गों का उपयोग क्यों किया जाता है।

<?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 बाइंडिंग फ़ाइल (binding.xml)

एक बाइंडिंग फ़ाइल जावा पीढ़ी के लिए स्कीमा अनुकूलित करने के लिए प्रयोग किया जाता है। आप निर्दिष्ट कर सकते हैं कि सब कुछ localScoping="top-level" के साथ एक शीर्ष स्तर का वर्ग होना चाहिए। जब आप ऐसा करते हैं तो आपको किसी संभावित नाम विवादों को हल करना सुनिश्चित करना होगा।

<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 कॉल

नीचे एक बाइंडिंग फ़ाइल को निर्दिष्ट जब XJC आदेश का उपयोग कर एक XML स्कीमा से जावा वर्गों उत्पन्न करने के लिए का एक उदाहरण है।

xjc -b binding.xml schema.xsd 

अधिक जानकारी के लिए