【问题标题】:No adapter for endpoint in Spring Web Service ResponseSpring Web 服务响应中没有端点适配器
【发布时间】:2013-03-07 22:03:49
【问题描述】:

我只是无法使用 Spring Web 服务解决这个错误。我相信我所做的一切都是正确的。

Soap 错误响应

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <SOAP-ENV:Fault>
         <faultcode>SOAP-ENV:Server</faultcode>
         <faultstring xml:lang="en">No adapter for endpoint [public void org.imsglobal.www.services.lis.pms2p0.wsdl11.sync.imspms_v2p0.PersonManagerSyncSoapBindingImpl.readPerson(org.imsglobal.www.services.lis.pms2p0.wsdl11.sync.imspms_v2p0.ReadPersonRequest,org.imsglobal.www.services.lis.pms2p0.wsdl11.sync.imspms_v2p0.Imsx_RequestHeaderInfoType,org.imsglobal.www.services.lis.pms2p0.wsdl11.sync.imspms_v2p0.holders.ReadPersonResponseHolder,org.imsglobal.www.services.lis.pms2p0.wsdl11.sync.imspms_v2p0.holders.Imsx_ResponseHeaderInfoTypeHolder)]: Is your endpoint annotated with @Endpoint, or does it implement a supported interface like MessageHandler or PayloadEndpoint?</faultstring>
      </SOAP-ENV:Fault>

注释

@Endpoint  
public class PersonManagerSyncSoapBindingImpl implements org.imsglobal.www.services.lis.pms2p0.wsdl11.sync.imspms_v2p0.PersonManagerSyncPortType{


    @PayloadRoot(localPart = "readPersonRequest", namespace = "http://www.imsglobal.org/services/lis/pms2p0/wsdl11/sync/imspms_v2p0")
    @ResponsePayload
    public void readPerson(@RequestPayload org.imsglobal.www.services.lis.pms2p0.wsdl11.sync.imspms_v2p0.ReadPersonRequest parameters, org.imsglobal.www.services.lis.pms2p0.wsdl11.sync.imspms_v2p0.Imsx_RequestHeaderInfoType headerInfoParameters, @RequestPayload org.imsglobal.www.services.lis.pms2p0.wsdl11.sync.imspms_v2p0.holders.ReadPersonResponseHolder response, @RequestPayload org.imsglobal.www.services.lis.pms2p0.wsdl11.sync.imspms_v2p0.holders.Imsx_ResponseHeaderInfoTypeHolder headerInfoResponse) {
        response.value = new org.imsglobal.www.services.lis.pms2p0.wsdl11.sync.imspms_v2p0.ReadPersonResponse();
        headerInfoResponse.value = new org.imsglobal.www.services.lis.pms2p0.wsdl11.sync.imspms_v2p0.Imsx_ResponseHeaderInfoType();
    }

spring-ws-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
            xmlns:context="http://www.springframework.org/schema/context"  
            xmlns:sws="http://www.springframework.org/schema/web-services"  
            xsi:schemaLocation="http://www.springframework.org/schema/beans  
                                     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
                                     http://www.springframework.org/schema/web-services  
                                     http://www.springframework.org/schema/web-services/web-services-2.0.xsd  
                                     http://www.springframework.org/schema/context  
                                     http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <context:component-scan base-package="*"></context:component-scan>
    <sws:annotation-driven/>

    <sws:dynamic-wsdl id="personServiceManagement"                                                           
        portTypeName="PersonManagerSyncPortType"                                                         
        locationUri="/endpoints/"                                                       
        targetNamespace="http://www.imsglobal.org/services/lis/pms2p0/wsdl11/sync/imspms_v2p0">                               
        <sws:xsd location="/WEB-INF/wsdl/xsd/PersonManagementService.xsd"/>                                                  
    </sws:dynamic-wsdl>

</beans>

【问题讨论】:

    标签: java spring spring-ws


    【解决方案1】:

    我收到了类似的错误消息。我的问题出在我从 XSD 生成的请求和响应类中。它错过了@XMLRootElement 注释。这导致操作描述(在 WSDL 中)和实现方法描述(在 Endpoint 中)不匹配。 将 JAXBElement 添加到我的端点方法解决了我的问题。

    import javax.xml.bind.JAXBElement;
    
    @PayloadRoot(namespace = "http://foo.bar/books", localPart = "GetBook")
    @ResponsePayload
    public JAXBElement<MyReponse> getBook(@RequestPayload JAXBElement<MyRequest>) {
        ...
    

    查看此博客了解更多详情:spring-ws: No adapter for endpoint

    【讨论】:

    • 谢谢!这为我解决了类似的问题。我应该看看ObjectFactory 类,使用了很多 JAXBElement 对象。
    • 你救了我!非常感谢!
    • 先生,您是传奇!
    • 这可行,但不能解决无效的 WSDL。您必须在操作部分中同时具有输入和输出元素。下面接受的答案是正确的解决方案,而不是这个
    【解决方案2】:

    我认为您缺少返回值。 Spring-WS 使用方法签名来映射请求/响应组合。例如,我在生成的 WSDL 中有以下操作:

    <wsdl:operation name="GetHiredCandidates">
        <wsdl:input message="tns:GetHiredCandidatesRequest" name="GetHiredCandidatesRequest"></wsdl:input>
        <wsdl:output message="tns:GetHiredCandidatesResponse" name="GetHiredCandidatesResponse"></wsdl:output>
    </wsdl:operation>
    

    要在此操作上映射方法,ResponsePayloadRequestPayload 需要匹配 WSDL 中定义的输入和输出:

    @ResponsePayload
    public GetHiredCandidatesResponse getKandidaat (@RequestPayload GetHiredCandidatesRequest) {
        ..
    
        return getHiredCandidatesResponse;
    }
    

    希望这会有所帮助!

    【讨论】:

    • 哈没有注意到,但是是的,这是有道理的。我转向了别的东西,但我相信这就是问题所在。
    【解决方案3】:

    我在使用 Spring-ws 和 SOAPUI 时遇到了类似的问题,并在 No adapter for endpoint SWS 的帮助下解决了这个问题

    【讨论】:

      【解决方案4】:

      在我的情况下,从对 jdom 的依赖切换到 jdom2 后,问题就消失了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-22
        • 1970-01-01
        • 2021-02-07
        • 1970-01-01
        • 1970-01-01
        • 2021-11-03
        相关资源
        最近更新 更多