java - 来自使用 Apache CXF 的 Web 服务的响应显示 "No binding operation info.."

标签 java eclipse web-services cxf

问题描述可能很长。由于我是 Web 服务的新手,请耐心等待并提供任何帮助。

我做了什么: 我使用 Apache CXF RI 在 Java 中创建了一个 Web 服务。我简单地创建了一个类并使用自下而上的开发方法来生成 SEI、WSDL 和 XML 文件。

问题是什么: 现在,如果我请求“http://localhost:8084/DeepThoughtWS/services/DeepThoughtPort/whatIsTheAnswer”,它会在调用带参数的未知方法时生成没有绑定(bind)操作信息的输出未知。 响应如下:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <soap:Fault>
      <faultcode>soap:Server</faultcode>
      <faultstring>No binding operation info while invoking unknown
      method with params unknown.</faultstring>
    </soap:Fault>
  </soap:Body>
</soap:Envelope>

生成的WSDL是:

<wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://ws.service.com/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
name="DeepThoughtService" targetNamespace="http://ws.service.com/">
  <wsdl:types>
    <schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:tns="http://ws.service.com/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns="http://www.w3.org/2001/XMLSchema">
      <import namespace="http://ws.service.com/"
      schemaLocation="http://localhost:8084/DeepThoughtWS/services/DeepThoughtPort?xsd=deepthought_schema1.xsd" />
    </schema>
  </wsdl:types>
  <wsdl:message name="whatIsTheAnswerResponse">
    <wsdl:part element="tns:whatIsTheAnswerResponse"
    name="parameters"></wsdl:part>
  </wsdl:message>
  <wsdl:message name="whatIsTheAnswer">
    <wsdl:part element="tns:whatIsTheAnswer" name="parameters">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="DeepThought">
    <wsdl:operation name="whatIsTheAnswer">
      <wsdl:input message="tns:whatIsTheAnswer"
      name="whatIsTheAnswer"></wsdl:input>
      <wsdl:output message="tns:whatIsTheAnswerResponse"
      name="whatIsTheAnswerResponse"></wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="DeepThoughtServiceSoapBinding"
  type="tns:DeepThought">
    <soap:binding style="document"
    transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="whatIsTheAnswer">
      <soap:operation soapAction="" style="document" />
      <wsdl:input name="whatIsTheAnswer">
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output name="whatIsTheAnswerResponse">
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="DeepThoughtService">
    <wsdl:port binding="tns:DeepThoughtServiceSoapBinding"
    name="DeepThoughtPort">
      <soap:address location="http://localhost:8084/DeepThoughtWS/services/DeepThoughtPort" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

DeepThought 类包括:

@WebService(targetNamespace = "http://ws.service.com/", portName = "DeepThoughtPort", serviceName = "DeepThoughtService")
public class DeepThought {
    public String whatIsTheAnswer(@WebParam(name = "arg0") String interviewer) {
        return ("The answer " + interviewer);
    }
}

请求时的控制台输出也显示了一些错误:

Feb 05, 2013 3:59:14 PM org.apache.cxf.service.invoker.AbstractInvoker invoke
SEVERE: Invocation without a binding operation.
Feb 05, 2013 3:59:14 PM org.apache.cxf.phase.PhaseInterceptorChain doDefaultLogging
WARNING: Interceptor for {http://ws.service.com/}DeepThoughtService has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: No binding operation info while invoking unknown method with params unknown.
    at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:59)
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    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:271)
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
    at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239)
    at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:218)
    at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:163)
    at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:137)
    at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:158)
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:243)
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:168)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:219)
    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:222)
    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:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
    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:1002)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Feb 05, 2013 3:59:14 PM org.apache.cxf.services.DeepThoughtService.DeepThoughtPort.DeepThought
INFO: Outbound Message
---------------------------
ID: 5
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>No binding operation info while invoking unknown method with params unknown.</faultstring></soap:Fault></soap:Body></soap:Envelope>

最佳答案

In general, this exception usually occurs if the incoming soap method doesn't correctly match the WSDL. In such a case, the soap message could not be mapped to an appropriate method on the service. CXF just doesn't know what to do. Double check the incoming soap message.

Source of the above explanation.

可能的解决方案:

@WebService(targetNamespace = "http://ws.service.com/",
        portName = "DeepThoughtPort",
        serviceName = "DeepThoughtService",
        endpointInterface = "your.pck.DeepThoughtService",
        wsdlLocation = "WEB-INF/wsdl/DeepThoughtService.wsdl")
public class DeepThought {

    @WebMethod(action = "whatIsTheAnswer")
    public String whatIsTheAnswer(@WebParam(name = "arg0") String interviewer) {
        return ("The answer " + interviewer);
    }
}

我要做的是在您的 @WebService 中添加 WSDL 位置和端点接口(interface)。此外,您使用的是 Java 优先方法,因此您的方法应使用 @WebMethod(action = "whatIsTheAnswer") 进行注释。因此,如果该方法未被注释 CXF“理解”您的 Web 服务根本不包含任何方法,并表示:No binding operation info while invoking unknown method with params unknown.

另请参阅:

关于java - 来自使用 Apache CXF 的 Web 服务的响应显示 "No binding operation info..",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14705362/

相关文章:

java - 如何通过 JOptionPane 捕获的用户输入将数据添加到 JList?

c++ - nsight eclipse 版本索引器的 CUDA 7.5 问题

c - 如何制作/配置 MPI 项目以在多个进程上运行?

Asp.Net 3.5 路由到 Web 服务?

java - 使用 ffmpeg 从图像创建视频文件

java - 此方法调用为非空方法参数传递一个空值。要么参数被注释为应始终为非空的参数

java - 是否可以将 Android JUnit 测试套件压缩到 JAR 文件中?

持续运行的 C# 代码 - 服务还是单独的线程?

android - KSoap2 Android 接收对象数组

java - 如何禁用 Play 2.6 CSRFFilter