Spring-WS withJMSの例で苦労しています。 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内)と実装されたメソッドの説明(エンドポイント内)が一致しませんでした。 エンドポイントメソッドに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:エンドポイント用のアダプターなし
同様のエラーが発生しました。問題は、XSD/WSDLから生成された要求と応答が@XMLRootElementアノテーションを見逃したことです。エンドポイントにJAXBElementを追加することで、問題を解決しました。
private static final String NAMESPACE_URI = "<targetNamespace>";
@Autowired
Service service;
@PayloadRoot ( namespace = Endpoint.NAMESPACE_URI, localPart = "name" )
@ResponsePayload
public JAXBElement < Response > Create ( @RequestPayload JAXBElement < Request> request ) throws Exception
{
ObjectFactory factory = new ObjectFactory ( );
Response response = new Response ( );
Request req = request.getValue ( );
response = this.service.call( req);
return factory.createResponse ( response );
}
同じエラーが発生しましたが、SpringWebサービス統合テストのみを実行していました。
問題は、テスト内の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();
}
テストを機能させるために、不足している2つのプロパティを定義しました。
@Before
public void init() throws Exception {
marshaller.setPackagesToScan(ClassUtils.getPackageName(Order.class));
marshaller.afterPropertiesSet();
marshaller.setContextPath("com.company.application");
marshaller.setMtomEnabled(true);
}
同じ問題ですが、私の場合は、注釈を配置するのを忘れたためです@ResponsePayload
および@RequestPayload
ハンドラー関数内。確認してください!おそらく必要なのはそれだけです。
まず、ガイドラインに従って、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;
}
}
そして、1つのServiceとそのimplementationクラスPayloadRootと他のAnnotations(Request and Response)
そしてこれを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" />
このメソッドは、SOAPUIから呼び出されたときに機能します。
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "getOrderDetail")
public @ResponsePayload JAXBElement<OrderDetailResponse> getOrderDetail(@RequestPayload JAXBElement<String> customerId, @RequestPayload JAXBElement<String> promoCode)
以下のメソッドでは、SOAPUIから値を入力しているにもかかわらず、customerStatusRequest内の値がnullになっています。
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "getCustomerStatus")
public @ResponsePayload
JAXBElement<CustomerStatusResponse> getCustomerStatus(@RequestPayload JAXBElement<CustomerStatusRequest> customerStatusRequest)
(CustomerStatusRequestはSerializableを実装します)
文字列パラメータ値が呼び出しを通過しているようです。しかし、カスタムクラスではありません。 CustomerStatusRequestクラスに次のように注釈を付けました。
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "CustomerStatusRequest", propOrder = {
"customerId",
"gender",
"dob",
"lastName",
"sourceSystemId"
},namespace="http://www.mycompany.com/webservices")
また、CustomerStatusRequestの各フィールドは次のようになります。
@XmlElement(name = "customerId", required = true, nillable = true)
メソッドが呼び出されますが、customerIdなどの値はまだnullとして入力されています。カスタムクラスに追加のアノテーションが必要ですか?
-ありがとう
私はWSDLファイルを使用していて、以下のように実行しましたが、機能しました。
@PayloadRoot(namespace = "http://www.myservice/v1.0/query", localPart = "queryRequest")
@ResponsePayload
public JAXBElement<QueryResponse> queryAddrLocation(@RequestPayload JAXBElement<QueryRequest> queryRequest) {
System.out.println("Welcome to " + queryRequest);
return createJaxbElement(new QueryResponse(), QueryResponse.class);
}
private <T> JAXBElement<T> createJaxbElement(T object, Class<T> clazz) {
return new JAXBElement<>(new QName(clazz.getSimpleName()), clazz, object);
}
完全なエンドポイントがどのように見えるかはわかりませんが、クラスに@Endpoint
アノテーションを付けるか、MessageHandler
またはPayloadEndpoint
を実装する必要があります。
他に遊ぶことができるのはメソッドシグネチャです。 Spring-WSのエンドポイントマッピングは非常にインテリジェントです。メソッドシグネチャからの入力クラスと出力クラスをWSDLファイルでマッピングしようとします。文字列がStoreImageResponse
ではなく@ResponsePayLoadであると確信していますか?
たとえば、これが私のエンドポイントの1つのメソッドシグネチャです
@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>
それがどのようにマッピングされているかわかりますか?おそらくあなたはあなたの署名にそのような何かを見逃しています。