8

jax-ws を使用した Web サービスは初めてです。私は、Web上のある種のチュートリアルに基づいて実装を開始していました。さらに、Androidクライアントを介してそのサービスにアクセスしようとしていたので、これを呼び出していました。

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>
4

4 に答える 4

16

あなたのWSDLによると:

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

SOAPAction は、「http://service.my/sayHello」ではなく、空の文字列にする必要があります。

于 2012-09-11T16:15:34.023 に答える
2

SOAPアクションは次のようになります。次の{http://service.my/}sayHelloように指定した場合:http://service.my/sayHello CXFはこれがアクションであることを認識しません。アクションではなく名前空間のように見えます。

これを変える:

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

これに:

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

そして、それはうまくいくはずです。

于 2012-09-03T08:58:44.820 に答える
1

CXF JAX-WS を使用しているときに、「指定された SOAPAction ... が操作と一致しません」のような同様の問題が発生しました。以下のように JAX-WS プロキシを使用する場合

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

これは、HTTP ヘッダー "SOAPAction" が "" に設定されていないことが原因です。以下のコードで設定できます: place to (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);
于 2012-11-28T07:33:49.543 に答える
0

System.Net.WebClient を使用したときにこのメッセージが表示されました。SoapAction がヘッダーで送信され、破棄する前に 2 つの操作でクライアントを再利用したため、2 回目の呼び出しで 2 つのアクションを送信しました... Clear() 各呼び出しが問題を解決する前に。

于 2020-03-24T13:05:40.013 に答える