spring-ws で Jaxb2Marschaller を使用する場合、プリミティブまたは基本的な Java 型を使用して Web サービス操作を作成することは可能ですか? たとえば、次のようなメソッドです。
@Override
@PayloadRoot(localPart = "AddTaskRequest", namespace = "http://example.com/examplews/")
public long addTask(final Task task) throws AddTaskFault {
// do something
return 0;
}
Maven jaxws プラグインを使用して、WSDL からインターフェースとモデル クラスを生成しています。Web サービスを呼び出そうとすると、次のエラーが発生します。
java.lang.IllegalStateException: エンドポイントのアダプターがありません [...]: エンドポイントは MessageHandler や PayloadEndpoint などのサポートされているインターフェイスを実装していますか
メソッドをそれに変更すると、次のことがわかりました。
@Override
@PayloadRoot(localPart = "AddTaskRequest", namespace = "http://example.com/examplews/")
public JAXBElement<Long> addTask(final JAXBElement<Task> task) throws AddTaskFault {
final ObjectFactory objectFactory = new ObjectFactory();
return objectFactory.createAddTaskResponse(0L);
}
呼び出すことはできますが、この署名は maven jaxws プラグインによって生成されたインターフェースと互換性がありません。
spring-ws を構成して最初の種類の実装を使用できるようにするか、maven jaxws プラグインにインターフェイスの 2 番目のバリアントを生成するように指示するにはどうすればよいですか?
更新: 関連する spring-ws 構成エントリは次のようになります。
<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="contextPath" value="com.example.examplews" />
</bean>
<bean class="org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter">
<constructor-arg ref="marshaller" />
</bean>
<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping">
<property name="order" value="1" />
</bean>