Подтвердить что ты не робот

Ответ от веб-службы с использованием Apache CXF показывает "Нет информации об операции привязки".

Описание проблемы может быть длинным. Пожалуйста, будьте терпеливы и предоставляйте любую помощь, так как я новичок в веб-сервисах.

Что я сделал: Я создал веб-службу в Java, используя Apache CXF RI. Я просто создал класс и использовал подход "снизу вверх" для создания файлов SEI, WSDL и XML.

В чем проблема: Теперь, если я запрашиваю "http://localhost:8084/DeepThoughtWS/services/DeepThoughtPort/whatIsTheAnswer", он выдает вывод как Нет информации операции привязки при вызове неизвестного метода с неизвестными параметрами. Ответ следующий:

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

Ответ 1

В общем случае это исключение обычно возникает, если входящий метод мыла не соответствует WSDL. В этом случае мыльное сообщение не может быть сопоставлен с соответствующим методом службы. CXF просто не знает, что делать. Дважды проверьте входящее сообщение с мылом.

Источник приведенного выше объяснения.

Возможное решение:

@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);
    }
}

Что бы я сделал, это добавить местоположение WSDL и endpointInterface в ваш @WebService. Также вы используете подход Java-First, поэтому ваш метод должен быть аннотирован с помощью @WebMethod(action = "whatIsTheAnswer"). Поэтому, если метод не аннотирован, CXF "понимает", что ваш веб-сервис вообще не содержит каких-либо методов и говорит: No binding operation info while invoking unknown method with params unknown.

См. также:

Ответ 2

У меня была та же проблема. Использование cxf 2.6 2.7 Этот запрос с помощью веб-браузера, такого как хром или firefox, просто не работал. Я попробовал использовать клиент в cxf, и он работает! Ваши веб-службы работают, но вы не можете сделать запрос через веб-браузер, вам нужен клиент, так как клиент знает требования XML.

Ответ 3

Да, уже ответил, что вы не можете напрямую обращаться к службе в URL-адресе браузера. Вам нужен клиентский код, подобный этому

import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.junit.Test;


@Test
public void testWhatIsTheAnswer() {

    JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();

    factoryBean.getInInterceptors().add(new LoggingInInterceptor());
    factoryBean.getOutInterceptors().add(new LoggingOutInterceptor());
    factoryBean.setServiceClass(DeepThought.class);
    factoryBean.setAddress("http://localhost:8084/DeepThoughtWS/services/DeepThoughtPort");

    DeepThought service = (DeepThought) factoryBean.create();

    service.whatIsTheAnswer("some answer");

}

Ответ 4

Кто-то вызывает ваш SOAP WebService с запросом GET, но SOAP WebServices не может получить запрос GET. Вы должны сказать ему/ей, не называть мой SOAP WebService запросом GET или вызывать мой веб-сервис с запросом GET, например описанным здесь.