2009-02-13 103 views
0

我有一些使用JAX-RPC构建的SOAP web服务。这些工作正常。但是,只要我添加一个处理程序,我会得到一个异常。从webservices.xml中删除绑定后,再次正常工作。JAX-RPC处理程序发生异常

奇怪的是,处理程序本身不包含在异常的栈跟踪中。我还注意到,在引发异常之前调用处理程序的initgetHeaders方法。

处理程序中加入下面的XML的webservices.xml:

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

处理程序本身只是一个存根,从接口的IDE产生的,所以我不会包括整个执行:

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

这实际上在我的日志记录中生成了三个例外(具有完全相同的时间戳)。由于长度的原因,我只包含一部分。

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 
    ... 

任何人都有一些想法来解决这个问题吗?

回答

2

您的图书馆处于不兼容状态。

重要的部分是:java.lang.ClassCastException: com.sun.xml.messaging.saaj.soap.impl.TextImpl cannot be cast to javax.xml.soap.SOAPBodyElement

这意味着要么JRE包含javax.xml的实现(即JRE 6.0),或在GlassFish含有用较新执行的运行时或者您包含一个不兼容的库。

有人打破了1.4 - > 1.5之间的xml实现。我建议在javax.xml.soap.SOAPBodyElement的所有jar中进行搜索。你会发现不兼容的副本(例如xml-beans stax或其他)。

+1

这使得某种意义。当SOAP请求体不包含元素之间的空白时,一切正常...... – doekman 2009-02-13 15:30:36