2010-05-09 7 views
1

Je reçois erreur javax.xml.bind.MarshalException. J'envoie la liste de mon webservice au backingbean et j'ai cette erreur.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) 

Voici mon code:

backing 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

Veuillez mettre à jour votre question pour inclure l'ensemble de la pile (formatée !!). Cochez la case de la colonne de droite pour les règles de formatage. Sélectionnez simplement le bloc de code, puis appuyez sur le bouton '010101' de la barre d'outils ou sur la touche' Ctrl + K'. – BalusC

Répondre

1

Je pense que le problème est lié en quelque sorte au problème JAX-WS and type substitution (il y a beaucoup de discussions à ce sujet sur les forums de java.net eg this one ou this one). En un mot, JAXB n'est pas capable de rassembler des classes qui ne sont pas explicitement référencées lorsque le JAXBContext est créé, ce qui est le cas pour Cantable ici.

Je ne suis pas 100% sûr que cela va résoudre le problème, mais pourriez-vous essayer d'utiliser un List paramétrisé au lieu d'un type brut dans votre webservice:

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

Faisant suite à la réponse de Pascal, pour une même problème du côté du service Web, la liste paramétrée n'a pas résolu le problème, mais l'annotation @XmlSeeAlso l'a fait.

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

Merci Pascal!