2012-08-31 3 views
4

jax-ws를 사용하는 웹 서비스가 처음입니다. 웹을 통해 일종의 자습서를 기반으로 구현하기 시작했습니다. 또한, 나는 안드로이드 클라이언트를 통해 해당 서비스에 액세스하려고 했으므로 이것을 호출했습니다.주어진 SOAPAction이 작업과 일치하지 않습니다.

private static final String SOAP_ACTION = "http://service.my/sayHello"; 
    androidHttpTransport.call(SOAP_ACTION, envelope); 

그러나 printstacktrace를 시도 할 때이 오류가 발생합니다.

WARNING: Interceptor for {http://service.my/}HelloServiceImplService#{http://service.my/}sayHello has thrown exception, unwinding now 
org.apache.cxf.interceptor.Fault: The given SOAPAction http://service.my/sayHello does not match an operation. 
    at org.apache.cxf.binding.soap.interceptor.SoapActionInInterceptor$SoapActionInAttemptTwoInterceptor.handleMessage(SoapActionInInterceptor.java:188) 
    at org.apache.cxf.binding.soap.interceptor.SoapActionInInterceptor$SoapActionInAttemptTwoInterceptor.handleMessage(SoapActionInInterceptor.java:162) 
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263) 
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) 
    at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:207) 
    at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:209) 
    at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:191) 
    at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:114) 
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:185) 
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:108) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:164) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

은 그런데 내 WSDL입니다 :

<wsdl:definitions xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://service.my/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="HelloServiceImplService" targetNamespace="http://service.my/"> 
<wsdl:types> 
<xs:schema xmlns:tns="http://service.my/" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified" targetNamespace="http://service.my/" version="1.0"> 
<xs:element name="sayHello" type="tns:sayHello"/> 
<xs:element name="sayHelloResponse" type="tns:sayHelloResponse"/> 
<xs:complexType name="sayHello"> 
<xs:sequence> 
<xs:element minOccurs="0" name="arg0" type="xs:string"/> 
</xs:sequence> 
</xs:complexType> 
<xs:complexType name="sayHelloResponse"> 
<xs:sequence> 
<xs:element minOccurs="0" name="return" type="xs:string"/> 
</xs:sequence> 
</xs:complexType> 
</xs:schema> 
</wsdl:types> 
<wsdl:message name="sayHelloResponse"> 
<wsdl:part element="tns:sayHelloResponse" name="parameters"></wsdl:part> 
</wsdl:message> 
<wsdl:message name="sayHello"> 
<wsdl:part element="tns:sayHello" name="parameters"></wsdl:part> 
</wsdl:message> 
<wsdl:portType name="HelloService"> 
<wsdl:operation name="sayHello"> 
<wsdl:input message="tns:sayHello" name="sayHello"></wsdl:input> 
<wsdl:output message="tns:sayHelloResponse" name="sayHelloResponse"></wsdl:output> 
</wsdl:operation> 
</wsdl:portType> 
<wsdl:binding name="HelloServiceImplServiceSoapBinding" type="tns:HelloService"> 
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 
<wsdl:operation name="sayHello"> 
<soap:operation soapAction="" style="document"/> 
<wsdl:input name="sayHello"> 
<soap:body use="literal"/> 
</wsdl:input> 
<wsdl:output name="sayHelloResponse"> 
<soap:body use="literal"/> 
</wsdl:output> 
</wsdl:operation> 
</wsdl:binding> 
<wsdl:service name="HelloServiceImplService"> 
<wsdl:port binding="tns:HelloServiceImplServiceSoapBinding" name="HelloServiceImplPort"> 
<soap:address location="http://192.168.0.102:8080/TestWS/myService"/> 
</wsdl:port> 
</wsdl:service> 
</wsdl:definitions> 

답변

2

다음과 같아야합니다 귀하의 SOAP 조치 : {http://service.my/}sayHello을이처럼 지정하는 경우 : CXF이이 조치는 것을 이해하지 않습니다 http://service.my/sayHello이 행동이 아니라 이름 공간처럼 보입니다.

변경이이에

private static final String SOAP_ACTION = "http://service.my/sayHello"; 

:

private static final String SOAP_ACTION = "{http://service.my/}sayHello"; 

그리고 그것은 작동합니다. 당신의 WSDL에 따르면

13

는 :

<soap:operation soapAction="" style="document"/> 

이 SOAPAction은 빈 문자열이 아니라 "http://service.my/sayHello"이어야합니다.

1

CXF JAX-WS를 사용할 때 "주어진 SOAPAction ... 작업과 일치하지 않습니다."와 비슷한 문제가 발생했습니다. 당신은 그것은 HTTP 헤더 "이 SOAPAction"에 의해 발생

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); 
factory.setAddress(endpointAddress); 
XXXServicePortType port = factory.create(XXXServicePortType.class); 
// (set HTTP header here) 
port.someMethod() 

아래처럼 JAX-WS 프록시를 사용하는 경우 은 "" 당신은 코드 아래를하여 설정할 수 있습니다하도록 설정되어 있지 님의 장소 (설정 HTTP 헤더를 여기에)

org.apache.cxf.endpoint.Client proxy = ClientProxy.getClient(port); 
Map<String, List<String>> headers = new HashMap<String, List<String>>(); 
headers.put("SOAPAction", Arrays.asList("")); 
proxy.getRequestContext().put(Message.PROTOCOL_HEADERS, headers); 
관련 문제