2009-02-13 4 views
0

Certains services Web SOAP sont créés avec JAX-RPC. Cela fonctionne bien. Mais dès que j'ajoute un gestionnaire, je reçois une exception. Lorsque la liaison est supprimée du fichier webservices.xml, tout fonctionne correctement. La chose étrange est, le gestionnaire lui-même n'est pas inclus dans la piletrace de l'exception. J'ai également remarqué, les méthodes init et getHeaders du gestionnaire sont appelées, avant que l'exception soit augmentée.Une exception se produit avec le gestionnaire JAX-RPC

Le gestionnaire est ajouté à webservices.xml avec le code XML suivant:

<handler> 
    <handler-name>My Message Handler</handler-name> 
    <handler-class>kpn.MyMessageHandler</handler-class> 
</handler> 

Le gestionnaire lui-même est juste un talon, généré par l'IDE de l'interface, donc je ne vais pas inclure la mise en œuvre entière:

public class MyMessageHandler implements javax.xml.rpc.handler.Handler { 
    @Override 
    public boolean handleRequest(MessageContext context) { 
    System.out.println("handel-Request"); 
    return true; 
    } 
    ... 
} 

Cela génère en fait trois exceptions dans ma journalisation (avec exactement le même horodatage). À cause de la longueur, je n'en inclue qu'une partie.

Log Level WARNING 
Logger javax.enterprise.system.container.web 
Message ID preWebHandlerError java.lang.ClassCastException 
Complete Message com.sun.xml.messaging.saaj.soap.impl.TextImpl cannot be cast to javax.xml.soap.SOAPElement at 
    com.sun.xml.rpc.server.StreamingHandler.getOpcodeForRequestMessage(StreamingHandler.java:657) at 
    com.sun.enterprise.webservice.WsUtil.getInvMethod(WsUtil.java:1277) at 
    com.sun.enterprise.webservice.ServletPreHandler.handleRequest(ServletPreHandler.java:86) at 
    com.sun.xml.rpc.client.HandlerChainImpl.handleRequest(HandlerChainImpl.java:103) at 
    com.sun.xml.rpc.server.StreamingHandler.callRequestHandlers(StreamingHandler.java:962) at 
    com.sun.xml.rpc.server.StreamingHandler.preHandlingHook(StreamingHandler.java:868) at 
    kpn.kpc.SOAPKPCReadCustomerClassification_v01PortType_Tie.preHandlingHook(SOAPKPCReadCustomerClassification_v01PortType_Tie.java:242) at 
    com.sun.xml.rpc.server.StreamingHandler.handle(StreamingHandler.java:127) at 
    com.sun.xml.rpc.server.http.JAXRPCServletDelegate.doPost(JAXRPCServletDelegate.java:467) at 
    com.sun.enterprise.webservice.JAXRPCServlet.doPost(JAXRPCServlet.java:119) at 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:738) at 
    ... 

Log Level SEVERE 
Logger com.sun.xml.rpc.server 
Message ID com.sun.xml.messaging.saaj.soap.impl.TextImpl cannot be cast to javax.xml.soap.SOAPBodyElement java.lang.ClassCastException 
Complete Message com.sun.xml.messaging.saaj.soap.impl.TextImpl cannot be cast to javax.xml.soap.SOAPBodyElement at 
    com.sun.enterprise.webservice.WsUtil.throwSOAPFaultException(WsUtil.java:1312) at 
    com.sun.enterprise.webservice.WsUtil.throwSOAPFaultException(WsUtil.java:1288) at 
    com.sun.enterprise.webservice.ServletPreHandler.handleRequest(ServletPreHandler.java:99) at 
    ... 

Log Level SEVERE 
Logger com.sun.xml.rpc.server 
Message ID JAXRPCTIE01 
Complete Message caught exception while handling request: java.lang.ClassCastException: com.sun.xml.messaging.saaj.soap.impl.TextImpl cannot be cast to javax.xml.soap.SOAPBodyElement java.lang.ClassCastException: com.sun.xml.messaging.saaj.soap.impl.TextImpl cannot be cast to javax.xml.soap.SOAPBodyElement at 
    com.sun.enterprise.webservice.WsUtil.throwSOAPFaultException(WsUtil.java:1312) at 
    com.sun.enterprise.webservice.WsUtil.throwSOAPFaultException(WsUtil.java:1288) at 
    com.sun.enterprise.webservice.ServletPreHandler.handleRequest(ServletPreHandler.java:99) at 
    ... 

Quelqu'un a-t-il des idées pour résoudre ce problème?

Répondre

2

Vos bibliothèques sont dans un état incompatible.

L'important est: java.lang.ClassCastException: com.sun.xml.messaging.saaj.soap.impl.TextImpl cannot be cast to javax.xml.soap.SOAPBodyElement

Cela signifie que soit le jre contient une implémentation pour javax.xml (c.-à-jre 6.0), ou l'GlassFish contient un moteur d'exécution avec une implémentation plus récente ou vous incluez une bibliothèque qui n'est pas compatible. Quelqu'un a cassé l'implémentation xml entre 1.4 -> 1.5. Je suggère une recherche dans tous les jars pour javax.xml.soap.SOAPBodyElement. Vous trouverez des doublons qui ne sont pas compatibles (par exemple xml-beans stax ou autre).

+1

Cela fait du sens. Lorsque le corps de la requête SOAP n'inclut pas les espaces entre les éléments, tout fonctionne bien ... – doekman

+0

J'ai le même problème mais je n'ai pas d'autre lib contenant "SOAPElement" juste "saaj-api-1.3.jar" dans mon fichier EAR. – ricardo

Questions connexes