2010-05-09 33 views
1

我收到javax.xml.bind.MarshalException錯誤。我從我的web服務發送列表到backingbean,我有這個錯誤。Java EE javax.xml.bind.MarshalException

WARNING: invocation error on ejb endpoint Login_webservice at /Login_webserviceService/Login_webservice : javax.xml.bind.MarshalException 
- with linked exception: 
[javax.xml.bind.JAXBException: class JPA.Cantable nor any of its super class is known to this context.] 
javax.xml.ws.WebServiceException: javax.xml.bind.MarshalException 
- with linked exception: 
[javax.xml.bind.JAXBException: class JPA.Cantable nor any of its super class is known to this context.] 
     at com.sun.xml.ws.message.jaxb.JAXBMessage.writePayloadTo(JAXBMessage.java:325) 
     at com.sun.xml.ws.message.AbstractMessageImpl.writeTo(AbstractMessageImpl.java:142) 
     at com.sun.xml.ws.encoding.StreamSOAPCodec.encode(StreamSOAPCodec.java:109) 
     at com.sun.xml.ws.encoding.SOAPBindingCodec.encode(SOAPBindingCodec.java:278) 
     at com.sun.xml.ws.transport.http.HttpAdapter.encodePacket(HttpAdapter.java:380) 
     at com.sun.xml.ws.transport.http.HttpAdapter.access$100(HttpAdapter.java:92) 
     at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:525) 
     at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:285) 
     at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:143) 
     at org.glassfish.webservices.Ejb3MessageDispatcher.handlePost(Ejb3MessageDispatcher.java:116) 
     at org.glassfish.webservices.Ejb3MessageDispatcher.invoke(Ejb3MessageDispatcher.java:87) 
     at org.glassfish.webservices.EjbWebServiceServlet.dispatchToEjbEndpoint(EjbWebServiceServlet.java:196) 
     at org.glassfish.webservices.EjbWebServiceServlet.service(EjbWebServiceServlet.java:127) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 

這裏是我的代碼:

支持bean

@WebServiceRef(wsdlLocation = "http://localhost:26565/Login_webserviceService/Login_webservice?WSDL") 
public String login() { 
    System.out.println("Login Phase entered"); 
    int result = 0; 
    List list; 
    List finalList = null; 
    try { 
     Weblogin.LoginWebserviceService service = new Weblogin.LoginWebserviceService(); 
     Weblogin.LoginWebservice port = service.getLoginWebservicePort(); 
     result = port.login(voterID, password); 
     Weblogin.LoginWebservice port1 = service.getLoginWebservicePort(); 
     list = port1.candDetails(1); 
     finalList = list; 
     this.setList(finalList); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    if (result == 1) 
     return "polling"; 
    else 
     return "login"; 
} 

Webservice的

public List candDetails(int pollEvent) { 
    List resultList = null; 
    List finalList = null; 
    try { 
     if (pollEvent == 1) { 
      resultList = em.createNamedQuery("Cantable.findAll").getResultList(); 
      finalList = resultList; 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return resultList; 
} 
+0

請更新您的問題,以包括整個堆棧跟蹤(格式!!)。檢查格式規則的右列框。只需選擇代碼塊,然後按工具欄中的「010101」按鈕或「Ctrl + K」鍵即可。 – BalusC 2010-05-09 01:52:48

回答

1

我認爲,這個問題以某種方式涉及到JAX-WS and type substitution問題(有很多在java.net論壇上討論這個問題,例如this onethis one)。簡而言之,當創建JAXBContext時,JAXB無法編組未被明確引用的類,這裏的Cantable就是這種情況。

我不是100%肯定這將解決這個問題,但你可以嘗試在你的Web服務使用參數化List代替原始類型:

public List<Cantable> candDetails(int pollEvent) { 
    ... 
} 
1

跟進帕斯卡的響應,對於類似問題在Web服務端,參數化的列表並沒有解決問題,但@XmlSeeAlso註釋。

@XmlSeeAlso({Cantable.class,Zot.class}) 
@WebService() 
@Stateless() 
public class Login { 

Thanks Pascal!