#web-services #spring #spring-mvc #jaxb #spring-ws
#веб-службы #spring #spring-mvc #jaxb #spring-ws
Вопрос:
Я новичок в Spring-WS, и я определил конечную точку на основе схемы, сгенерированной из аннотированных классов JAXB. Однако, когда я пытаюсь получить доступ к конечной точке через SoapUI, я получаю следующую ошибку вместе с кодом ответа 404:
No endpoint mapping found for [SaajSoapMessage {clip}clipClaimRequest]
Есть идеи относительно того, что я делаю неправильно? Спасибо за любую помощь.
Класс конечной точки:
@Endpoint
public class TestEndpoint {
@PayloadRoot(localPart = "clipClaimRequest", namespace = "clip")
@ResponsePayload
public CLIPClaimResponse registerClaim(@RequestPayload CLIPClaimRequest request) {
return new CLIPClaimResponse("Success", "test success");
}
}
Классы запросов / ответов (маршалируемые / немаршалируемые через JAXB):
@XmlRootElement(name = "clipClaimRequest")
@XmlType(name = "CLIPClaimRequest")
public class CLIPClaimRequest {
private Claim claim;
@XmlElement(required = true)
public Claim getClaim() {
return claim;
}
public void setClaim(Claim claim) {
this.claim = claim;
}
}
И:
@XmlRootElement(name = "clipClaimResponse")
@XmlType(name = "CLIPClaimResponse")
public class CLIPClaimResponse {
private String code;
private String description;
public CLIPClaimResponse() {
}
public CLIPClaimResponse(String code, String desc) {
setCode(code);
setDescription(desc);
}
@XmlElement(required = true)
public String getCode() {
return code;
}
@XmlElement(required = true)
public String getDescription() {
return description;
}
public void setCode(String code) {
this.code = code;
}
public void setDescription(String description) {
this.description = description;
}
}
web.xml
конфигурация сервлета:
<servlet>
<servlet-name>spring-ws</servlet-name>
<servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
<init-param>
<description>This is used by SpringWS to dynamically convert WSDL urls</description>
<param-name>transformWsdlLocations</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring-ws</servlet-name>
<url-pattern>/clipClaimService/*</url-pattern>
</servlet-mapping>
spring-ws-servlet.xml
конфигурация:
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<context:annotation-config />
<sws:annotation-driven />
<sws:dynamic-wsdl id="claimRegistration" portTypeName="CLIPClaimPort"
locationUri="/clipClaimService/" targetNamespace="clip">
<sws:xsd location="/WEB-INF/CLIP_Poc.xsd" />
</sws:dynamic-wsdl>
<bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<!-- list of classes... -->
</list>
</property>
<property name="schema" value="/WEB-INF/CLIP_PoC.xsd" />
</bean>
<bean id="marshallingPayloadMethodProcessor"
class="org.springframework.ws.server.endpoint.adapter.method.MarshallingPayloadMethodProcessor">
<constructor-arg ref="jaxb2Marshaller" />
<constructor-arg ref="jaxb2Marshaller" />
</bean>
<bean id="defaultMethodEndpointAdapter"
class="org.springframework.ws.server.endpoint.adapter.DefaultMethodEndpointAdapter">
<property name="methodArgumentResolvers">
<list>
<ref bean="marshallingPayloadMethodProcessor" />
</list>
</property>
<property name="methodReturnValueHandlers">
<list>
<ref bean="marshallingPayloadMethodProcessor" />
</list>
</property>
</bean>
</beans>
И CLIP_PoC.xsd
, наконец, схема, из которой был сгенерирован WSDL:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="clip" targetNamespace="clip" version="1.0">
<xs:element name="clipClaimRequest" type="CLIPClaimRequest"/>
<xs:element name="clipClaimResponse" type="CLIPClaimResponse"/>
<!-- type definitions for all the complex elements used... -->
</xs:schema>
Ответ №1:
Я понял это. Я забыл поместить: <context:component-scan base-package="my.base.package"/>
в свой spring-ws-servlet.xml
файл. Это как-то исправило это.