WebService接口调用时,出现java.lang.RuntimeException: org.apache.cxf.interceptor.Fault异常,求破解 50
org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:102)
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:315)
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:113)
org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:97)
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:461)
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:149)
org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:148)
org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179)
org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:108)
javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159)
com.shpy.ebpm.filter.LoginTimeOutFilter.doFilter(LoginTimeOutFilter.java:53)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
root cause 展开
关于这个错误,在开发调试过程中可以先通过辅助工具来观察它原始的 xml 内容是什么样的,这段 xml内容中包括一个 fault相关联的 xml 标签,里面记录着异常消息的原始文本,不管是哪个 web service API 它们要处理的 XML 内容是完全相同的标准。
但是如果这个异常是在你这个客户端本身抛出的而不是从远程服务端返回的那就复杂些,需要看其它的日志。像很多开源的软件都有一套日志,比如假设它使用了 log4j 啥的,我们就可以配置一个 log4j.properties 并把 org.apache.cxf 的 logger category 启用 all 或 debug 级别的日志输出,这也是一个观察 CXF 中间如何处理一个例外情况的分析方法。实在不行就找 CXF 的源码或反编译这个异常 Stack Trace 中提到的那几个类猜测一下可能的原因。
WebService几个常见的异常分类:
1、如果出现这个错误:java.lang.NoClassDefFoundError: javax/xml/soap/SOAPException,原因是没有导入 axis2-saaj.jar包
2、如果出现这个错误:java.lang.NoClassDefFoundError: javax/xml/soap/SOAPException,原因是没有导入 axis2-saaj.jar包
3、如果出现这个错误:org.apache.commons.logging.LogFactory,原因是没有导入commons-logging.jar包
4、如果出现这个错误:Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Error invoking (……) Nested exception is java.lang.reflect.InvocationTargetException: null,原因是代码上传到服务器时不完全导致的。
关于这个错误,我觉得你在开发调试过程中可以先通过辅助工具来观察它原始的 xml 内容是什么样的,这段 xml 内容中包括一个 fault 相关联的 xml 标签,里面记录着异常消息的原始文本,不管是哪个 web service API 它们要处理的 XML 内容是完全相同的标准。
而如果这个异常是在你这个客户端本身抛出的而不是从远程服务端返回的那就复杂些,需要看其它的日志。像很多开源的软件都有一套日志,比如假设它使用了 log4j 啥的,我们就可以配置一个 log4j.properties 并把 org.apache.cxf 的 logger category 启用 all 或 debug 级别的日志输出,这也是一个观察 CXF 中间如何处理一个例外情况的分析方法。实在不行就找 CXF 的源码或反编译这个异常 Stack Trace 中提到的那几个类猜测一下可能的原因。
是啊,就是只说了个异常让人很蛋疼
那你能推断这个异常是客户端抛出的还是从服务端返回来的么?如果是服务端返回的只有“异常”两个字,我们就没办法了,只能让界面上显示“未知系统错误”。
如果是客户端出现的错误就是我们的程序的责任我们需要分析出原因并在界面上告知用户这是他们输入了错误的数据还是因为系统出现什么未知错误。
分析客户端抛出的异常的方法前面已经讲过了,如果 CXF 也用到了 log4j 我们可以增加或修改 log4j.properties 配置让它开启 org.apache.cxf 的 logger 在 debug 级别上把所有消息打印出来我们按时间顺序来分析可能是哪个数据出现了问题。