我正在努力使用带有JMS示例的Spring-WS。我按照Spring的建议设置了Spring-WS和JMS接线。但我一直得到以下错误。我不知道如何绕过这个问题,任何帮助将不胜感激:
[org.springframework.ws.soap.server.endpoint.SoapFaultAnnotationExceptionResolver] -
Resolving exception from endpoint
[org.springframework.ws.samples.mtom.ws.ImageRepositoryEndpoint@1c8b0b1]:
java.lang.IllegalStateException: No adapter for endpoint
[org.springframework.ws.samples.mtom.ws.ImageRepositoryEndpoint@1c8b0b1]:
Is your endpoint annotated with @Endpoint, or does it implement a supported interface like MessageHandler or PayloadEndpoint?
[org.springframework.ws.soap.server.endpoint.SimpleSoapExceptionResolver] - Resolving exception from endpoint
[org.springframework.ws.samples.mtom.ws.ImageRepositoryEndpoint@1c8b0b1]:
java.lang.IllegalStateException: No adapter for endpoint [org.springframework.ws.samples.mtom.ws.ImageRepositoryEndpoint@1c8b0b1]:
Is your endpoint annotated with @Endpoint, or does it implement a supported interface like MessageHandler or PayloadEndpoint?
[org.springframework.ws.soap.server.SoapMessageDispatcher] -
Endpoint invocation resulted in exception - responding with Fault
java.lang.IllegalStateException: No adapter for endpoint [org.springframework.ws.samples.mtom.ws.ImageRepositoryEndpoint@1c8b0b1]:
Is your endpoint annotated with @Endpoint, or does it implement a supported interface like MessageHandler or PayloadEndpoint?
我的Web服务接线是
<bean id="imageRepository"
class="org.springframework.ws.samples.mtom.service.StubImageRepository" />
<!-- JMS WIRING TO WS START -->
<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory" />
<bean id="messageDispatcher"
class="org.springframework.ws.soap.server.SoapMessageDispatcher">
<property name="endpointMappings">
<bean
class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping">
<property name="defaultEndpoint">
<bean
class="org.springframework.ws.samples.mtom.ws.ImageRepositoryEndpoint">
<constructor-arg ref="imageRepository" />
</bean>
</property>
</bean>
</property>
</bean>
<bean
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="jmsConnectionFactory" />
<property name="destinationName" value="WS.JMS.EXAMPLE.V1.IMAGE.REPO.REQUEST" />
<property name="messageListener">
<bean
class="org.springframework.ws.transport.jms.WebServiceMessageListener">
<property name="messageFactory" ref="messageFactory" />
<property name="messageReceiver" ref="messageDispatcher" />
</bean>
</property>
</bean>
我的终点代码是
@PayloadRoot(localPart = "StoreImageRequest", namespace = "http://www.springframework.org/spring-ws/samples/mtom")
@ResponsePayload
public String store(@RequestPayload JAXBElement<Image> requestElement) throws IOException {
Image request = requestElement.getValue();
return imageRepository.storeImage(request.getName());
}
我的架构是
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.springframework.org/spring-ws/samples/mtom"
xmlns:tns="http://www.springframework.org/spring-ws/samples/mtom"
xmlns:xmime="http://www.w3.org/2005/05/xmlmime" elementFormDefault="qualified">
<element name="StoreImageRequest" type="tns:Image"/>
<element name="LoadImageRequest" type="string"/>
<element name="LoadImageResponse" type="tns:Image"/>
<complexType name="Image">
<sequence>
<element name="name" type="string"/>
</sequence>
</complexType>
</schema>
我的客户请求是
<ns2:StoreImageRequest xmlns:ns2="http://www.springframework.org/spring-ws/samples/mtom"><ns2:name>spring-ws-logo.png</ns2:name></ns2:StoreImageRequest>
有人可以帮忙吗?
我有一个类似的错误消息。我的问题出在我从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> myRequest) {
...
有关更多详细信息,请参阅此博客:spring-ws: No adapter for endpoint
我不确定你的完整端点看起来如何,但是该类应该用@Endpoint
注释,或者它应该实现MessageHandler
或PayloadEndpoint
。
您可以使用的其他方法是方法签名。 Spring-WS'端点映射非常智能:它尝试使用WSDL文件映射方法签名中的输入和输出类。你确定String是@ResponsePayLoad,而不是StoreImageResponse
吗?
例如,这是我的一个端点的方法签名
@PayloadRoot(
localPart = "GetHiredCandidatesRequest",
namespace = DEFAULT_NAMESPACE
)
@ResponsePayload
public GetHiredCandidatesResponse getCandidates (
@RequestPayload GetHiredCandidatesRequest getCandidate,
MessageContext messageContext) {
...
}
这在我的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>
你看到它是如何映射的吗?也许你在签名中遗漏了类似的东西。
首先,根据指南,应该有一个Endpoint类
@Endpoint
public class EmpEndpoint {
@Autowired
private EmpService empService;
//This is like @RequestMapping of Spring MVC
@PayloadRoot(localPart = "EmpServiceRequest", namespace = "http://www.example.org/")
@ResponsePayload
public EmpServiceResponse getemployeeDetails(@RequestPayload EmpServiceRequest request) {
EmpServiceResponse response = new ObjectFactory().createEmpServiceResponse();
List<Employee> l = empService.getemployeeDetails(request.getName());
response.setName(l.get(0).getName());
response.setEmail(l.get(0).getEmail());
return response;
}
}
一个Service及其实现类,它将具有PayloadRoot和其他注释(请求和响应)
并将其放在spring-servlet.xml中
<!-- To detect @Endpoint -->
<sws:annotation-driven/>
<!-- To detect @Service, @Component etc -->
<context:component-scan base-package="your package for eg com.employee" />
同样的问题,但在我的情况下是因为我忘了在注册表函数中放置注释@ResponsePayload
和@RequestPayload
。检查一下!这可能就是它所需要的一切。
我使用的是WSDL文件,如下所示,然后就可以了。
@PayloadRoot(namespace = "http://www.myservice/v1.0/query", localPart = "queryRequest")
@ResponsePayload
public JAXBElement<QueryResponse> query(@RequestPayload JAXBElement<QueryRequest> queryRequest) {
System.out.println("Welcome to " + queryRequest.getRequestName());
return new QueryResponse();
}
我有同样的错误,但只运行我的Spring Web服务集成测试。
问题是,如果与测试中的Jaxb2Marshaller
相比,我设置了不同配置的Jaxb2Marshaller
。我没有使用相同的Bean进行应用程序和测试。
运行应用程序的Jaxb2Marshaller
是:
private Jaxb2Marshaller marshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPath("com.company.application");
marshaller.setMtomEnabled(true);
return marshaller;
}
但在我的测试中,我使用的是:
@Before
public void init() throws Exception {
marshaller.setPackagesToScan(ClassUtils.getPackageName(Order.class));
marshaller.afterPropertiesSet();
}
为了使测试工作,我只是定义了两个缺少的属性:
@Before
public void init() throws Exception {
marshaller.setPackagesToScan(ClassUtils.getPackageName(Order.class));
marshaller.afterPropertiesSet();
marshaller.setContextPath("com.company.application");
marshaller.setMtomEnabled(true);
}