0 0

在CXF中使用WSS4J报错3

异常信息

信息: Interceptor has thrown exception, unwinding now
org.apache.cxf.binding.soap.SoapFault: Problem writing SAAJ model to stream
at org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor.handleMessage(SAAJOutInterceptor.java:127)
at org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor.handleMessage(WSS4JOutInterceptor.java:94)
at org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor.handleMessage(WSS4JOutInterceptor.java:47)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:471)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:301)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:253)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:121)
at $Proxy49.showHello(Unknown Source)
at Test.main(Test.java:13)
Caused by: javax.xml.soap.SOAPException: Failed to create MessageFactory: org.apache.axis.soap.MessageFactoryImpl
at javax.xml.soap.MessageFactory.newInstance(MessageFactory.java:55)
at org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor.getFactory(SAAJOutInterceptor.java:80)
at org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor.handleMessage(SAAJOutInterceptor.java:113)
... 10 more
Caused by: java.lang.ClassNotFoundException: org.apache.axis.soap.MessageFactoryImpl
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at javax.xml.soap.MessageFactory.newInstance(MessageFactory.java:50)
... 12 more
Exception in thread "main" javax.xml.ws.WebServiceException: org.apache.cxf.binding.soap.SoapFault: Problem writing SAAJ model to stream
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:139)
at $Proxy49.showHello(Unknown Source)
at Test.main(Test.java:13)
Caused by: org.apache.cxf.binding.soap.SoapFault: Problem writing SAAJ model to stream
at org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor.handleMessage(SAAJOutInterceptor.java:127)
at org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor.handleMessage(WSS4JOutInterceptor.java:94)
at org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor.handleMessage(WSS4JOutInterceptor.java:47)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:471)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:301)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:253)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:121)
... 2 more
Caused by: javax.xml.soap.SOAPException: Failed to create MessageFactory: org.apache.axis.soap.MessageFactoryImpl
at javax.xml.soap.MessageFactory.newInstance(MessageFactory.java:55)
at org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor.getFactory(SAAJOutInterceptor.java:80)
at org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor.handleMessage(SAAJOutInterceptor.java:113)
... 10 more
Caused by: java.lang.ClassNotFoundException: org.apache.axis.soap.MessageFactoryImpl
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at javax.xml.soap.MessageFactory.newInstance(MessageFactory.java:50)
... 12 more



服务端配置


<?xml version="1.0" encoding="UTF-8"?>
<!-- START SNIPPET: beans -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

<!-- WebService中的安全,采用WSS4J来实现 -->
<bean id="wss4jInInterceptor"
class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<constructor-arg>
<map>
<!-- 表示验证机制是用户姓名令牌,也就是使用传统的用户名和密码机制 -->
<entry key="action" value="UsernameToken"></entry>
<!-- 表示密码类型是文本,还可以是WSConstants.PASSWORD_DIGEST(密码会被加密为MD5) -->
<entry key="passwordType" value="PasswordText"></entry>
<!-- 表示服务器端验证密码的回调处理类,这个类必须实现CallbackHandler接口 -->
<entry key="passwordCallbackClass"
value="com.guzhi.wss4j.test.ServerPasswordCallbackHandle">
</entry>
</map>
</constructor-arg>
</bean>

<!-- 实现方式 访问地址http://localhost:8080/webService_cxf_wss4j/helloWorld?wsdl-->
<jaxws:endpoint id="helloWorldWs"
implementor="com.guzhi.HelloServiceImpl" address="/helloWorld">
<!-- 添加安全安全拦截器 -->
<jaxws:inInterceptors>
<ref bean="wss4jInInterceptor" />
</jaxws:inInterceptors>
<jaxws:inFaultInterceptors>
<!-- 错误日志 -->
<bean
class="org.apache.cxf.interceptor.LoggingInInterceptor">
</bean>
</jaxws:inFaultInterceptors>
<jaxws:outFaultInterceptors>
<bean
class="org.apache.cxf.interceptor.LoggingOutInterceptor">
</bean>
</jaxws:outFaultInterceptors>
</jaxws:endpoint>


</beans>

客户端配置

<?xml version="1.0" encoding="UTF-8"?>
<!-- START SNIPPET: beans -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

<!-- WebService中的安全,采用WSS4J来实现 -->
<bean id="wss4jOutInterceptor"
class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
<constructor-arg>
<map>
<!-- 表示验证机制是用户姓名令牌,也就是使用传统的用户名和密码机制 -->
<entry key="action" value="UsernameToken"></entry>
<!-- 用于初始化用户名,这是一个必选项 -->
<entry key="user" value="Fetion"></entry>
<!-- 表示密码类型是文本,还可以是WSConstants.PASSWORD_DIGEST(密码会被加密为MD5) -->
<entry key="passwordType" value="PasswordText"></entry>
<!-- 表示服务器端验证密码的回调处理类,这个类必须实现CallbackHandler接口 -->
<entry key="passwordCallbackClass"
value="com.guzhi.client.ClientPasswordCallbackHandle">
</entry>
</map>
</constructor-arg>
</bean>
<jaxws:client id="helloServiceClient"
address="http://localhost:8080/webService_cxf_wss4j/helloWorld" serviceClass="com.guzhi.IHelloService">
   <jaxws:outInterceptors>
      <ref bean="wss4jOutInterceptor"/>
   </jaxws:outInterceptors>
</jaxws:client>
</beans>


同样的问题  http://www.iteye.com/topic/173742

问题补充:
lovewhzlq 写道
java.lang.ClassNotFoundException: org.apache.axis.soap.MessageFactoryImpl

少了jar包,




我吧Axis包倒进来啦,刚才那个错不报啦,可是现在有报成这个错误啦

org.w3c.dom.DOMException: No such Localname for SOAP URI
at org.apache.axis.message.SOAPDocumentImpl.createElementNS(SOAPDocumentImpl.java:379)
at org.apache.axis.SOAPPart.createElementNS(SOAPPart.java:1109)
at org.apache.cxf.staxutils.W3CDOMStreamWriter.writeStartElement(W3CDOMStreamWriter.java:132)
at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.writeSoapEnvelopeStart(SoapOutInterceptor.java:118)
at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleMessage(SoapOutInterceptor.java:80)
at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleMessage(SoapOutInterceptor.java:61)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:471)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:301)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:253)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:121)
at $Proxy49.showHello(Unknown Source)
at Test.main(Test.java:13)
Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: No such Localname for SOAP URI
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:141)
at $Proxy49.showHello(Unknown Source)
at Test.main(Test.java:13)
Caused by: org.w3c.dom.DOMException: No such Localname for SOAP URI
at org.apache.axis.message.SOAPDocumentImpl.createElementNS(SOAPDocumentImpl.java:379)
at org.apache.axis.SOAPPart.createElementNS(SOAPPart.java:1109)
at org.apache.cxf.staxutils.W3CDOMStreamWriter.writeStartElement(W3CDOMStreamWriter.java:132)
at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.writeSoapEnvelopeStart(SoapOutInterceptor.java:118)
at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleMessage(SoapOutInterceptor.java:80)
at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleMessage(SoapOutInterceptor.java:61)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:471)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:301)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:253)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:121)
... 2 more

问题补充:
lovewhzlq 写道
java.lang.ClassNotFoundException: org.apache.axis.soap.MessageFactoryImpl

少了jar包,



老兄你差点把我误导,刚才那问题不是导入axis的问题,现在的问题已经解决啦。
javax.xml.soap.MessageFactory.newInstance在执行的时候他默认找的的是axis里的MessageFactoryImpl,这样是不对的,他应该找com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl中实现。
最终答案:
客户端在执行之前向设置:
System.setProperty("javax.xml.soap.MessageFactory",
"com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl");
或者是在虚拟机执行之前先设置:
-Djavax.xml.soap.MessageFactory=com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl



我的例子
public class Test {
public static void main(String[] args) {
System.setProperty("javax.xml.soap.MessageFactory",
"com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl");
        ClassPathXmlApplicationContext classPath
        = new ClassPathXmlApplicationContext(new String[] {"client-beans.xml"});
        /**
         * 实现方式
         */
       
        IHelloService client=(IHelloService)classPath.getBean("helloServiceClient");
        client.showHello("赵艳芳==哈哈");
}

但是必须向把axis中包先删掉

问题补充:
lovewhzlq 写道
java.lang.ClassNotFoundException: org.apache.axis.soap.MessageFactoryImpl

少了jar包,


第二种实现方式是一个图片
2010年3月30日 10:53
  • 大小: 109 KB

1个答案 按时间排序 按投票排序

0 0

java.lang.ClassNotFoundException: org.apache.axis.soap.MessageFactoryImpl

少了jar包,

2010年3月30日 11:51

相关推荐

Global site tag (gtag.js) - Google Analytics