我有以下wsdl文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<definitions
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://soap.securityconstraintapp.smals.be/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsp="http://www.w3.org/ns/ws-policy"
xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:s0="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata"
targetNamespace="http://soap.securityconstraintapp.smals.be/"
name="SAMLSecuredHelloImplService">
<types>
<xsd:schema targetNamespace="http://soap.securityconstraintapp.smals.be/"
xmlns="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="principal">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</types>
<message name="getHello">
<part name="arg0" type="xsd:string" />
</message>
<message name="getHelloResponse">
<part name="return" type="xsd:string" />
</message>
<message name="getPrincipalRequest"></message>
<message name="getPrincipalResponse">
<part name="principal" type="xsd:string" />
</message>
<portType name="SAMLSecuredHello">
<operation name="getHello">
<input
wsam:Action="http://soap.securityconstraintapp.smals.be/SAMLSecuredHello/getHelloRequest"
message="tns:getHello" />
<output
wsam:Action="http://soap.securityconstraintapp.smals.be/SAMLSecuredHello/getHelloResponse"
message="tns:getHelloResponse" />
</operation>
<operation name="getPrincipal">
<input
wsam:Action="http://soap.securityconstraintapp.smals.be/SAMLSecuredHello/getPrincipalRequest"
message="tns:getPrincipalRequest" />
<output
wsam:Action="http://soap.securityconstraintapp.smals.be/SAMLSecuredHello/getPrincipalResponse"
message="tns:getPrincipalResponse" />
</operation>
</portType>
<binding name="SAMLSecuredHelloImplPortBinding" type="tns:SAMLSecuredHello">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="rpc" />
<operation name="getHello">
<input>
<soap:body use="literal"
namespace="http://soap.securityconstraintapp.smals.be/" />
</input>
<output>
<soap:body use="literal"
namespace="http://soap.securityconstraintapp.smals.be/" />
</output>
</operation>
<operation name="getPrincipal">
<input>
<soap:body use="literal"
namespace="http://soap.securityconstraintapp.smals.be/" />
</input>
<output>
<soap:body use="literal"
namespace="http://soap.securityconstraintapp.smals.be/" />
</output>
</operation>
</binding>
<service name="SAMLSecuredHelloImplService">
<port name="SAMLSecuredHelloImplPort" binding="tns:SAMLSecuredHelloImplPortBinding"></port>
</service>
</definitions>
我使用cxf从这个wsdl生成我的java,它工作正常。
第一个操作getHello工作正常,但getPrincipalrequest没有,我想这是我的wsdl中的一些小错误,但我似乎无法找到它。
我的cxf引发此请求的错误:
10:13:36,778 WARNING [org.apache.cxf.phase.PhaseInterceptorChain] (http-172.17.0.2:8080-3) Interceptor for {http://soap.securityconstraintapp.smals.be/}SAMLSecuredHelloImplService has thrown exception, unwinding now: org.apache.cxf.interceptor.Fault: Message part {http://soap.securityconstraintapp.smals.be/}getPrincipal was not recognized. (Does it exist in service WSDL?)
at org.apache.cxf.interceptor.BareInInterceptor.handleMessage(BareInInterceptor.java:133)
at org.apache.cxf.binding.soap.interceptor.RPCInInterceptor.handleMessage(RPCInInterceptor.java:111)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:249)
at org.jboss.wsf.stack.cxf.RequestHandlerImpl.handleHttpRequest(RequestHandlerImpl.java:97)
at org.jboss.wsf.stack.cxf.transport.ServletHelper.callRequestHandler(ServletHelper.java:131)
at org.jboss.wsf.stack.cxf.CXFServletExt.invoke(CXFServletExt.java:88)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:289)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:209)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:754)
at org.jboss.wsf.stack.cxf.CXFServletExt.service(CXFServletExt.java:136)
at org.jboss.wsf.spi.deployment.WSFServlet.service(WSFServlet.java:140)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:231)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:420)
at org.keycloak.adapters.saml.AbstractSamlAuthenticatorValve.invoke(AbstractSamlAuthenticatorValve.java:184)
at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:559)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102)
at be.smals.jboss.ProxyValve.invoke(ProxyValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:854)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:656)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:926)
at java.lang.Thread.run(Thread.java:748) [rt.jar:1.8.0_131]
我得到的回复:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns1:getHelloResponse xmlns:ns1="http://soap.securityconstraintapp.smals.be/">
<return>SAML, hello ababa</return>
</ns1:getHelloResponse>
</soap:Body>
</soap:Envelope>
和
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>Message part {http://soap.securityconstraintapp.smals.be/}getPrincipal was not recognized. (Does it exist in service WSDL?)</faultstring>
</soap:Fault>
</soap:Body>
</soap:Envelope>
更新
更改后
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc" />
到
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
我得到了以下错误:
10:11:57,657 WARNING [org.apache.cxf.phase.PhaseInterceptorChain] (http-172.17.0.2:8080-1) Interceptor for {http://soap.securityconstraintapp.smals.be/}SAMLSecuredHelloImplService has thrown exception, unwinding now: java.lang.NullPointerException
at org.apache.cxf.service.factory.SimpleMethodDispatcher.getMethod(SimpleMethodDispatcher.java:97)
at org.jboss.wsf.stack.cxf.JBossWSInvoker.invoke(JBossWSInvoker.java:146)
at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [rt.jar:1.8.0_131]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [rt.jar:1.8.0_131]
at org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37)
at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:107)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:249)
at org.jboss.wsf.stack.cxf.RequestHandlerImpl.handleHttpRequest(RequestHandlerImpl.java:97)
at org.jboss.wsf.stack.cxf.transport.ServletHelper.callRequestHandler(ServletHelper.java:131)
at org.jboss.wsf.stack.cxf.CXFServletExt.invoke(CXFServletExt.java:88)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:289)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:209)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:754)
at org.jboss.wsf.stack.cxf.CXFServletExt.service(CXFServletExt.java:136)
at org.jboss.wsf.spi.deployment.WSFServlet.service(WSFServlet.java:140)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:231)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:420)
at org.keycloak.adapters.saml.AbstractSamlAuthenticatorValve.invoke(AbstractSamlAuthenticatorValve.java:184)
at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:559)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102)
at be.smals.jboss.ProxyValve.invoke(ProxyValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:854)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:656)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:926)
at java.lang.Thread.run(Thread.java:748) [rt.jar:1.8.0_131]
10:11:57,691 INFO [org.apache.cxf.services.SAMLSecuredHelloImplService.SAMLSecuredHelloImplPort.SAMLSecuredHello] (http-172.17.0.2:8080-1) Outbound Message
---------------------------
ID: 2
Response-Code: 500
Encoding: UTF-8
Content-Type: text/xml
Headers: {}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><soap:Fault><faultcode>soap:Server</faultcode><faultstring>Fault occurred while processing.</faultstring></soap:Fault></soap:Body></soap:Envelope>
--------------------------------------