2010-07-13 7 views
30

के लिए नहीं जाना जब मैं एक विशेष शोकहारा सेवा विधि कॉल, मैं निम्न त्रुटि, किसी को पता हो क्यों और कैसे इसे हल करने के लिए?JAXB अपवाद: कक्षा, जो <em>CXF</em> का उपयोग कर बनाया गया है इस संदर्भ

JAXBException हुआ: कक्षा com.octory.ws.dto।

public class Service { 
    public Response results() { 
    Collection<ProfileDto> profilesDto = new ArrayList<ProfileDto>(); 
    ... 
    SearchResultDto srd = new SearchResultDto(); 
    srd.setResultEntities(profilesDto); // Setting profilesDto collection as resultEntities 
    srd.setResultSize(resultSize); 
    return Response.ok(srd).build(); 
    } 
} 

SearchResultDto:

@XmlRootElement(name="searchResult") 
public class SearchResultDto { 
    private Collection resultEntities; 
    private int resultSize; 

    public SearchResultDto() { } 

    @XmlElementWrapper(name="resultEntities") 
    public Collection getResultEntities() { 
     return resultEntities; 
    } 

    public void setResultEntities(Collection resultEntities) { 
     this.resultEntities = resultEntities; 
    } 

    public int getResultSize() { 
     return resultSize; 
    } 

    public void setResultSize(int resultSize) { 
     this.resultSize = resultSize; 
    } 
} 
ProfileDto और न ही अपनी सुपर वर्ग इस संदर्भ के लिए जाना जाता है के किसी भी ...

के बाद सेवा विधि और प्रासंगिक DTOs हैं

प्रोफ़ाइल:

@XmlRootElement(name="profile") 
public class ProfileDto { 
    ... 
    ... 
    public ProfileDto() { } 
    ... 
} 

उत्तर

33

आपका ProfileDto वर्ग SearchResultDto में संदर्भित नहीं है। @XmlSeeAlso(ProfileDto.class) को SearchResultDto जोड़ने का प्रयास करें।

+0

@XmlSeeAlso जोड़ा जा रहा है इस मुद्दे को हल; मैं इस धारणा के तहत था कि एनोटेशन केवल तभी जरूरी था जब संदर्भित वर्ग एक उप-वर्ग था। धन्यवाद। – ABK07

+4

क्या होगा यदि कक्षा 'SearchResultDto ' है जहां टी सामान्य है? –

+4

@ हेन्डी इरावॉन - एनोटेशन को वेब सेवा में भी जोड़ा जा सकता है (यानी '@ वेब सेवा' एनोटेशन के बाद)। यदि आप जेनेरिक से निपट रहे हैं तो अतिरिक्त स्तरों को घोषित करने के लिए और अधिक समझदारी होती है क्योंकि उस चरण तक आपको प्रकारों का पूरा सेट पता होना चाहिए। – CurtainDog

0

मेरे पास टोमकैट पर एक ही अपवाद था .. मुझे एक और समस्या मिली - जब मैं 1 डब्ल्यूएसडीएल - कक्षा ObjectFactory (इस कक्षा के स्टब्स संदर्भ) के लिए स्टब्स उत्पन्न करने के लिए मेवेन प्लगइन पर wsimport का उपयोग करता हूं, केवल एक wsdl के लिए विधियों में शामिल होता है। तो आपको सभी विधियों को एक ObjectFactory कक्षा (प्रत्येक डब्लूएसडीएल के लिए) में मर्ज करना चाहिए या विभिन्न निर्देशिकाओं में प्रत्येक wsdl स्टब्स उत्पन्न करना चाहिए (ObjectFactory कक्षाएं अलग-अलग होंगी)। यह इस exception..J साथ मेरे लिए समस्या का हल

24

मैं इस त्रुटि थी क्योंकि मैं कोड की इस पंक्ति में गलत वर्ग पंजीकृत:

JAXBContext context = JAXBContext.newInstance(MyRootXmlClass.class); 
3

यह त्रुटि संदेश क्योंकि या तो अपने ProfileDto वर्ग पंजीकृत नहीं है तो क्या होगा जेएक्सबी सामग्री में, या इसका उपयोग करने वाली कक्षा JAXB द्वारा संसाधित करने के लिए @XmlSeeAlso(ProfileDto.class) का उपयोग नहीं करती है।

अपनी टिप्पणी के बारे में:

मैं यह धारणा थी एनोटेशन केवल जरूरत थी जब संदर्भित वर्ग एक उप-वर्ग था।

नहीं, वे भी जब JAXB संदर्भ में घोषित नहीं किया या, उदाहरण के लिए, जब केवल वर्ग इसे करने के लिए एक स्थिर संदर्भ होने इस संदर्भ @XmlTransient साथ एनोटेट है की जरूरत है। मैं एक ट्यूटोरियल here बनाए रखता हूं।

+0

आपके ट्यूटोरियल के लिए धन्यवाद। इस जवाब में "सामग्री" "संदर्भ" होना चाहिए? – djb

2

JAXB marshaller की संपत्ति "classesToBeBound" करने के लिए वर्ग के नाम निर्धारित करके यह निश्चित:

<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
     <property name="classesToBeBound"> 
      <list> 
       <value>myclass</value> 
      </list> 
     </property> 
</bean> 
3

मैं वसंत बूट के साथ एक ही समस्या थी। जब मैंने मार्शेलर को पैकेज सेट किया तो यह हल हो गया।

@Bean 
public Jaxb2Marshaller marshaller() throws Exception 
{ 
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); 
    marshaller.setPackagesToScan("com.octory.ws.dto"); 
    return marshaller; 
} 

@Bean 
public WebServiceTemplate webServiceTemplate(final Jaxb2Marshaller marshaller) 
{ 
    WebServiceTemplate webServiceTemplate = new WebServiceTemplate(); 
    webServiceTemplate.setMarshaller(marshaller); 
    webServiceTemplate.setUnmarshaller(marshaller); 
    return webServiceTemplate; 
} 
संबंधित मुद्दे