Spring-WS:找不到端点映射

14
我制作了一个简单的网络服务,但是当我尝试在SoapUI上测试它时,出现了这个错误:
WARN : [Oct-11 12:56:38,081] ws.server.EndpointNotFound - No endpoint mapping found for [SaajSoapMessage {http://www.servesy.com/api/v1/service}signupRequest]

我不知道应该怎么做才能使它正确,我看到了很多关于这个问题的问题,但没有找到任何解决方案。
我的spring-ws配置如下: (除了这个配置之外,我还尝试了制作简单的输入输出示例,结果也显示相同的警告)

web.xml

<web-app 
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/config/servesy-config.xml
        </param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>servesyservices</servlet-name>
        <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
        <init-param>
            <param-name>transformWsdlLocations</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value></param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>servesyservices</servlet-name>
        <url-pattern>*.wsdl</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>servesyservices</servlet-name>
        <url-pattern>/endpoints/*</url-pattern>
    </servlet-mapping>

</web-app>

servesy-config.xml

<beans 
    <context:component-scan base-package="com.servesy.webservices" />
    <sws:annotation-driven />


    <bean id="ServesyService" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition" lazy-init="true">
        <property name="schemaCollection">
            <bean class="org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection">
                <property name="inline" value="true" />

                    <property name="xsds">
                        <list>
                            <value>schemas/ServesyServices.xsd</value>
                        </list>
                    </property>

            </bean>
        </property>
        <property name="portTypeName" value="ServesyService"/>
        <property name="serviceName" value="ServesyServices" />
        <property name="locationUri" value="/endpoints"/>
    </bean>
</beans>

终点(Endpoint)
@Endpoint
public class ServesyWebServiceEndpoint {

        private static final String TARGET_NAMESPACE ="http://www.servesy.com/api/v1/service";


        private ServesyWebService servesyservice_i;

        @Autowired
        public void setServesyWebService(ServesyWebService servesyservice_p)
        {
            this.servesyservice_i = servesyservice_p;
        }



        @PayloadRoot(localPart="SignupRequest", namespace=TARGET_NAMESPACE)
        public @ResponsePayload SignupResponse response(SignupRequest signupRequest) {

            SignupResponse signupResponse = new SignupResponse();
            Signup signup = servesyservice_i.signupResponse( signupRequest.getMobileNumber(), signupRequest.getPassword(), signupRequest.getCustomerName(), signupRequest.getEmailId(), signupRequest.getPromoCode(), signupRequest.getDevice());
            signupResponse.setSignup(signup);
            return signupResponse;
        }

        @PayloadRoot(localPart="LoginRequest", namespace=TARGET_NAMESPACE)
        public @ResponsePayload LoginResponse response(LoginRequest loginRequest) {

            LoginResponse loginResponse = new LoginResponse();
            String string = servesyservice_i.signinResponse( loginRequest.getEmailID(), loginRequest.getPassword(), loginRequest.getDevice());
            loginResponse.setSessionId(string);
            return loginResponse;
        }
    }

我的SoupUI会给出这种空白输出: 在此输入图片描述
4个回答

23
EndpointNotFoundException 是指Spring-WS未能找到合适的@Endpoint来处理传入请求时所发生的异常。
在这种情况下,传入消息的命名空间为http://www.servesy.com/api/v1/service,本地名称为signupRequest(可以在日志中看到)。虽然您的@PayloadRoot映射具有相同的命名空间,但它的本地名称不同,因为它使用大写字母S的SignupRequest。如果您将大写字母S改为小写字母s,则很可能会解决该问题。

2

我曾经遇到过类似的问题,根本原因在于应用程序servlet上下文路径。

我认为解决这个问题的最佳方法是设置"org.springframework.ws"DEBUG日志级别,并仔细观察日志。你应该能够找到像这样的消息:

o.s.w.s.e.mapping.UriEndpointMapping - Mapped key [/ws/CardInfoWS_v3] onto endpoint [bean 'cardInfoEndpointGateway_v3'; defined in: '...']

发送请求后的警告信息如下:

o.s.w.s.e.mapping.UriEndpointMapping - Looking up endpoint for [/cms-ws/ws/CardInfoWS_v3]
o.s.ws.server.EndpointNotFound - No endpoint mapping found for [SaajSoapMessage {...}GetCardRequest]

所以... 它正在寻找键"/cms-ws/ws/CardInfoWS_v3"下的端点映射,但是该端点已在键"/ws/CardInfoWS_v3"下注册。

您还可以将断点放置在您的端点映射器(AbstractMapBasedEndpointMappingAbstractMethodEndpointMapping)中的方法lookupEndpoint上,它看起来像这样:

protected Object lookupEndpoint(String key) {
    return endpointMap.get(key);
}

发送请求后,在调试模式下,您将看到所有已注册的端点当前正在搜索的密钥


0
上下文级别参数也需要在MessageDispatcherServlet级别中反映。

<servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class> <br>
        <init-param> <br>
            <param-name>transformWsdlLocations</param-name> <br>
            <param-value>true</param-value> <br>
        </init-param> <br>
        <init-param> <br>
            <param-name>contextConfigLocation</param-name> <br>
            <param-value>/WEB-INF/config/servesy-config.xml</param-value> <br>
        </init-param> <br>


0

就我所知,我遇到了这个问题 2021-02-17 14:13:52.810 DEBUG 204429 --- [nio-8080-exec-7] o.s.w.soap.server.SoapMessageDispatcher : Endpoint mapping [org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping@7f98f516] has no mapping for request ,而我遵循的是https://spring.io/guides/gs/producing-web-service/-,问题在于我不小心忘记给端点加上注释@Endpoint public class CountryEndpoint


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接