因为工作的需要,我们需要在某些JSP页面中调用其他应用的webservice的客户端,我使用了ECLIPSE的xfire客户端生成工具生成了具体的代码。代码在JAVA APPLICATION中可以测试通过,但是在我们的WEB页面上调用就一直报错。
例子代码如下:
其中 IUserServiceClient 与 IUserServicePortType 是ECLIPSE自动生成的客户端调用类。
checkName方法是检查用户名在远程数据库中是否存在的一个方法。我测试此段代码可以正常运行。public static void main(String[] param){
        IUserServiceClient client = new IUserServiceClient();
IUserServicePortType service = client.getIUserServiceHttpPort();
Object b = service.checkName("123456");
        System.out.println( b);
  
}但是在我们的WEB应用的一个StrutsAction的一个工具方法中调用:
public static boolean checkUserName(String userName){
boolean b = false;
IUserServiceClient client = new IUserServiceClient();
IUserServicePortType service = client.getIUserServiceHttpPort();
b = service.checkName(userName);
return b;
}
userName的传值是正常的情况下,一旦调用则出现以下错误:[http-8080-Processor46] ERROR actions.DispatchAction  - Dispatch[/webCensor/test/userAction] to method doRegisterUser returned an exception
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:280)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:216)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:627)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at ces.com.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:93)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:875)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Thread.java:595)Caused by: java.lang.NoSuchMethodError: com.sun.org.apache.xerces.internal.util.NamespaceSupport.containsPrefixInCurrentContext(Ljava/lang/String;)Z
at com.sun.xml.internal.stream.writers.XMLStreamWriterImpl.writeNamespace(XMLStreamWriterImpl.java:1019)
at org.codehaus.xfire.soap.SoapSerializer.writeMessage(SoapSerializer.java:58)
at org.codehaus.xfire.transport.http.HttpChannel.writeWithoutAttachments(HttpChannel.java:56)
at org.codehaus.xfire.transport.http.CommonsHttpMessageSender.getByteArrayRequestEntity(CommonsHttpMessageSender.java:422)
at org.codehaus.xfire.transport.http.CommonsHttpMessageSender.send(CommonsHttpMessageSender.java:360)
at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:123)
at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48)
at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26)
at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79)
at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114)
at org.codehaus.xfire.client.Client.invoke(Client.java:336)
at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77)
at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57)
at $Proxy13.checkName(Unknown Source)
at ces.webCensor.controler.RegisterInfoControler.checkUserName(RegisterInfoControler.java:188)
at ces.webCensor.controler.RegisterInfoControler.getFsUserName(RegisterInfoControler.java:248)
at ces.webCensor.controler.RegisterInfoControler.doRegister(RegisterInfoControler.java:268)
at ces.webCensor.controler.RegisterInfoControler.registerInfo(RegisterInfoControler.java:231)
at ces.netapply.common.action.BaseAction.doRegisterUser(BaseAction.java:1060)
... 29 more
这个错误的报错的目标类我查找过,该类在JDK1.5中的RT.JAR中是存在的,在我的项目的LIB中也有一个jaxb-ri.jar中也存在。
不同的是前者没有该方法,后者拥有该方法。我删除了jaxb-ri.jar一样报这个错误。我个人猜测是某些包不兼容或者TOMCAT环境的问题,但是找了很久没有找出原因,在GOOGLE上也找不到相关的错误代码。这个问题困扰我两天了,不知道有没同行在部署WEBSERVICE客户端的时候也有碰到这个问题,请不吝指教!