2008-11-18 12 views
40

संभाल सकते हैं मैं जब मेरे आवेदन को तैनात करने की कोशिश कर निम्नलिखित अपवाद प्राप्त करने के लिए लग रहा था:java.util.List एक इंटरफेस है, और JAXB इंटरफेस

Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of  IllegalAnnotationExceptions 
java.util.List is an interface, and JAXB can't handle interfaces. 
this problem is related to the following location: 
    at java.util.List 
    at private java.util.List  foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse._return 
    at  foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse 
java.util.List does not have a no-arg default constructor. 
    this problem is related to the following location: 
     at java.util.List 
     at private java.util.List foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse._return 
    at  foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse 


मेरे कोड सिर्फ अच्छी तरह से काम जब तक मैं बदल सूची से वापसी प्रकार < सूची सूची में <RelationCanonical> >

यहाँ आंशिक वेब सेवा है:


@Name("relationService") 
@Stateless 
@WebService(name = "RelationService", serviceName = "RelationService") 
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) 
public class RelationService implements RelationServiceLocal { 

    private boolean login(String username, String password) { 
     Identity.instance().setUsername(username); 
     Identity.instance().setPassword(password); 
     Identity.instance().login(); 
     return Identity.instance().isLoggedIn(); 
    } 

    private boolean logout() { 
     Identity.instance().logout(); 
     return !Identity.instance().isLoggedIn(); 
    } 

    @WebMethod 
    public List<List<RelationCanonical>> getRelationsFromPerson(@WebParam(name = "username") 
    String username, @WebParam(name = "password") 
    String password, @WebParam(name = "foedselsnummer") 
    String... foedselsnummer) { 

...... 
...... 
...... 
} 


मैंने @SOAP बाइंडिंग को हटाने और डिफ़ॉल्ट रूप से प्रयास करके भी कोशिश की है, लेकिन एक ही परिणाम होता है। किसी भी मदद

अद्यतन

मैं कुछ बाहर नोट करने के लिए चाहते हैं की सराहना। मैंने सभी सूची को ArrayList में बदल दिया, और फिर इसे संकलित किया। कारण मैं संकलित और काम नहीं करता क्योंकि यह अजीब व्यवहार करता है। मुझे टाइप का ऑब्जेक्ट मिलता है: RelationServiceStub.ArrayList लेकिन ऑब्जेक्ट को कोई तरीका नहीं मिला है या किसी सूची के रूप में व्यवहार नहीं करता है। मैंने इसे एक सूची में डालने की भी कोशिश की लेकिन यह काम नहीं किया।

ध्यान दें कि यह एक्सिस 2 और wsdl2java का उपयोग करने के बाद है, तो हाँ, अब यह संकलित है, लेकिन मुझे नहीं पता कि डेटा कैसे प्राप्त किया जाए।

उत्तर

24

मेरी समझ में, आप जेएक्सबी के माध्यम से एक सादे List को संसाधित करने में सक्षम नहीं होंगे, क्योंकि जेएक्सबी को यह नहीं पता कि एक्सएमएल में इसे कैसे परिवर्तित किया जाए।

बजाय, आप एक JAXB प्रकार है जो एक List<RelationCanonical> रखती है परिभाषित करने के लिए की आवश्यकता होगी (मैं इसे Type1 फोन करता हूँ), और एक दूसरे से उन प्रकार की एक सूची धारण करने के लिए, बारी में (के रूप में आप एक List<List<...>> साथ काम कर रहे; मैं इस प्रकार Type2 पर कॉल करूंगा)।

परिणाम तो इस तरह एक एक्सएमएल ouput हो सकता है:

<Type2 ...> 
    <Type1 ...> 
     <RelationCanonical ...> ... </RelationCanonical> 
     <RelationCanonical ...> ... </RelationCanonical> 
     ... 
    </Type1> 
    <Type1> 
     <RelationCanonical ...> ... </RelationCanonical> 
     <RelationCanonical ...> ... </RelationCanonical> 
     ... 
    </Type1> 
    ... 
</Type2> 

दो enclosing JAXB-एनोटेट प्रकार के बिना, JAXB प्रोसेसर में विफल रहता है पता नहीं क्या मार्कअप उत्पन्न करने के लिए है, और इस तरह।

--Edit:

क्या मेरा मतलब है इस तरह कुछ हद तक दिखना चाहिए:

@XmlType 
public class Type1{ 

    private List<RelationCanonical> relations; 

    @XmlElement 
    public List<RelationCanonical> getRelations(){ 
     return this.relations; 
    } 

    public void setRelations(List<RelationCanonical> relations){ 
     this.relations = relations; 
    } 
} 

और

@XmlRootElement 
public class Type2{ 

    private List<Type1> type1s; 

    @XmlElement 
    public List<Type1> getType1s(){ 
     return this.type1s; 
    } 

    public void setType1s(List<Type1> type1s){ 
     this.type1s= type1s; 
    } 
} 

तुम भी JAXB section in the J5EE tutorial और Unofficial JAXB Guide की जांच करनी चाहिए।

8

उसे अपने उद्देश्य तो आप हमेशा इस तरह एक सरणी को परिभाषित कर सकते हैं:

YourType[] 

JAXB निश्चित रूप से पता लगा सकते हैं कि क्या है और आप इसे ग्राहक के पक्ष का उपयोग immediatly में सक्षम होना चाहिए।मैं आपको इस तरह से ऐसा करने की भी सिफारिश करता हूं, क्योंकि आपको किसी सूची से किसी सर्वर से पुनर्प्राप्त सरणी को संशोधित करने में सक्षम नहीं होना चाहिए, लेकिन वेब सेवा

1

द्वारा प्रदान की गई विधियों के माध्यम से यदि आप किसी भी कक्षा के लिए ऐसा करना चाहते हैं।

return items.size() > 0 ? items.toArray((Object[]) Array.newInstance(
      items.get(0).getClass(), 0)) : new Object[0]; 
-6

आप "ArrayList" के बजाय आंतरिक "सूची"

+1

हाँ मैं पहले से ही सवाल है कि मैं इस किया था में उल्लेख उपयोग कर सकते हैं, लेकिन यह अभी भी काम नहीं किया। अद्यतन पढ़ें –

संबंधित मुद्दे