web-dev-qa-db-fra.com

La réponse du service Web utilisant Apache CXF indique "Aucune information sur l'opération de liaison .."

La description du problème peut être longue. S'il vous plaît soyez patient et fournir tout type d'aide puisque je suis nouveau sur les services Web.

Ce que j'ai fait} _ J'ai créé un service Web en Java à l'aide d'Apache CXF RI. J'ai simplement créé une classe et utilisé une approche de développement ascendante pour générer des fichiers SEI, WSDL et XML.

Quel est le problème: Maintenant, si je demande "http://localhost:8084/DeepThoughtWS/services/DeepThoughtPort/whatIsTheAnswer", la sortie est générée sous la forme Aucune information sur l'opération de liaison en appelant une méthode inconnue avec des paramètres inconnus. La réponse est la suivante:

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

La WSDL générée est:

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

La classe DeepThought comprend:

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

La sortie de la console au moment de la demande affiche également des erreurs:

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>
14
Sujan

En général, cette exception se produit généralement si la méthode soap entrante ne correspond pas correctement au WSDL. Dans un tel cas, le message de savon n'a pas pu être associé à une méthode appropriée sur le service. CXF juste ne sait pas quoi faire. Vérifiez le message de savon entrant.

Source de l'explication ci-dessus.

Solution possible:

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

Ce que je voudrais faire est d'ajouter l'emplacement WSDL et endpointInterface dans votre @WebService. De plus, vous utilisez l'approche Java-First, votre méthode doit donc être annotée avec @WebMethod(action = "whatIsTheAnswer"). Donc, si la méthode n'est pas annotée, CXF "comprend" que votre service Web ne contient aucune méthode et dit: No binding operation info while invoking unknown method with params unknown.

Voir également:

8
Paulius Matulionis

J'ai eu le même problème. Utilisation de cxf 2.6 2.7 Cette requête d’un navigateur Web tel que chrome ou firefox n’a tout simplement pas fonctionné. J'ai essayé d'utiliser un client dans cxf et ça marche! Vos services Web fonctionnent, mais vous ne pouvez pas faire de demande avec un navigateur Web. Vous avez besoin d’un client, car celui-ci connaît les exigences du XML. 

3
Hector Martinez

Vous devez interroger à l'aide de wsdl (par exemple, en ajoutant? Wsdl) à la fin de l'URL pour vérifier le fonctionnement de votre service Web. Le navigateur ne peut envoyer aucune demande de savon en tant que client de savon.

1
Abir Khan

Oui, vous avez déjà répondu, vous ne pouvez pas accéder directement au service dans une URL de navigateur. Vous avez besoin d'un code client comme celui-ci

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");

}
1
Jay

Quelqu'un appelle votre SOAP WebService avec la demande GET, mais SOAP WebServices ne peut pas recevoir la demande GET. Vous devriez lui dire de ne pas appeler ma SOAP WebService avec la demande GET ou d'appeler mon service Web avec la demande GET comme décrit ici .

1
oguzhankinik