我有个调用web service的问题,不知道你们是否有这方面的专家能帮我一下,谢谢。
我在使用Axis2 1.5.1+Rampart1.4做Web Service的客户端的调用。现在在添加了SOAP Header后,发生了一个异常,我在网上搜过,但是没找到解决方案。
 
log4j:WARN No appenders could be found for logger (org.apache.axiom.om.impl.builder.StAXOMBuilder).
log4j:WARN Please initialize the log4j system properly.
org.apache.axis2.AxisFault: Error in extracting message properties
 at org.apache.rampart.handler.RampartSender.invoke(RampartSender.java:70)
 at org.apache.axis2.engine.Phase.invoke(Phase.java:318)
 at org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:251)
 at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:416)
 at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:402)
 at org.apache.axis2.description.OutInA! ! xisOperationClient.executeImpl(OutInAxisOperation.java:229)
 at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
 at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:540)
 at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:521)
 at WebServiceUtil.callWebService(WebServiceUtil.java:59)
 at WebServiceClientImpl.getCCMSCodeInfoList(WebServiceClientImpl.java:34)
 at TestGetCCMSCodeInfo.main(TestGetCCMSCodeInfo.java:8)
Caused by: org.apache.rampart.RampartException: Error in extracting message properties
 at org.apache.rampart.RampartMessageData.<init>(RampartMessageData.java:322)
 at org.apache.rampart.MessageBuilder.build(MessageBuilder.java:61)
 at org.apache.rampart.handler.RampartSender.invoke(RampartSender.java:64)
 ... 11 more
Caused by: org.apache.ws.security.WSSecurityException: Error in converting SOAP Envelope ! to! Document; nested exception is: 
 java. lan g.ClassCastException: org.apache.axiom.om.impl.llom.OMElementImpl
 at org.apache.rampart.util.Axis2Util.getDocumentFromSOAPEnvelope(Axis2Util.java:161)
 at org.apache.rampart.RampartMessageData.<init>(RampartMessageData.java:158)
 ... 13 more
Caused by: java.lang.ClassCastException: org.apache.axiom.om.impl.llom.OMElementImpl
 at org.apache.rampart.util.Axis2Util.getDocumentFromSOAPEnvelope(Axis2Util.java:111)
 ... 14 more
Exception in thread "main" java.lang.NullPointerException
 at WebServiceClientImpl.getCCMSCodeInfoList(WebServiceClientImpl.java:36)
 at TestGetCCMSCodeInfo.main(TestGetCCMSCodeInfo.java:8) 
我debug进入到代码,是Axis2Util.java 111行里面类型转换发生的错误。
 SOAPHeaderBlock element = (SOAPHeaderBlock) headerBlocs.next();
headerBlocs.next()的类型是OMElementImpl,所以发生了转换错误,但是我不知道如何去改正。我的类里面发生错误的地方是:

ServiceClient sender = new ServiceClient(ctx, null);
Options options = new Options();
options.setAction(action);
options.setTo(new EndpointReference(getValueFromPropery("URL")));
options.setProperty(RampartMessageData.KEY_RAMPART_POLICY,
loadPolicy(rampartPath + "/policy.xml"));
options.setUserName("BJ000001");
options.setPassword("password");
sender.setOptions(options);
sender.engageModule("rampart");sender.addHeader(generateMOEHeader());sender.sendReceive(soapRequest);请大虾们帮忙看看。

解决方案 »

  1.   

    方案一:
    在Eclipse中开发相关项目时,在控制台经常看到如下信息: 
     log4j:WARN No appenders could be found for logger 
     log4j:WARN Please initialize the log4j system properly. 
            此处输出信息并不是错误信息而仅只是警告信息,因为log4j无法输出日志,log4j是一个日志输入软件包。可以将Struts或Hibernate等压缩包解压,内有log4j.properties文件,将它复制到项目src文件夹或将log4j.properties放到 \WEB-INF\classes文件夹中即可。 方案二:
    这几天做一个SSH项目,tomcat启动时出现以下问题: log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader). 
    log4j:WARN Please initialize the log4j system properly. 在网上查了一下,多是说把ContextLoaderListener改为SpringContextServlet,但我这样改了没用。后来在一个英文网站上看到一个遇到同样问题的帖子,他是这样改的: <context-param> 
       <param-name>log4jConfigLocation</param-name> 
       <param-value>/WEB-INF/config/log4j.properties</param-value> 
    </context-param> ······ <!-- 定义LOG4J监听器 --> 
    <listener> 
       <listener-class> 
    org.springframework.web.util.Log4jConfigListener 
       </listener-class> 
    </listener> 这样改了问题就解决了,不用再修改ContextLoaderListener。
      

  2.   

    问题自己解决了。定义ConfigurationContext ctx = ConfigurationContextFactory
         .createConfigurationContextFromFileSystem(rampartPath, null);需要指定一个Axis2.xml。这个文件可以通过ConfigurationContext ctx = ConfigurationContextFactory
         .createConfigurationContextFromFileSystem(rampartPath, ramPath+“/axis2.xml”);的方式指定。
    这个文件需要放在rampart文件夹下面,或者其他地方,上面那个参数就要指定他的路径就可以了。