2

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>
4

2 に答える 2

4

Spring-WS が を に一致させようとするときEndpointAdapterEndpointエンドポイント メソッドのすべてのパラメーターとその戻り値が に認識されている型であり、認識されないことを確認しJaxb2Marshallerますlong。概念的には、これは理にかなっています。なぜなら、JAXB はlongより多くの情報がなければ a を XML に変換する方法がわからないからです (ここで情報が必要になりますJAXBElement)。

Spring-WS はJAX-WS 実装ではなく、そのふりをしていないことに注意してください。JAX-WS で生成されたアーティファクトを取り、それらが Spring_WS で機能することを期待することは実際には期待できませんが、多くの場合、Spring-WS はそれに対処するのに十分な柔軟性を備えています。

于 2009-11-12T14:35:16.467 に答える
0

何を変更できるかわからないので、これが私の設定に関連するすべてのものです。それらはかなり異なり、これを行ってから1年半が経過しています。

    <bean id="schemaCollection"
        class="org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection">
        <property name="xsds" value="/my.xsd" />
        <property name="inline" value="true" />
    </bean>

    <bean id="marshallingEndpoint"
        class="....EndpointImpl">
    </bean>

    <oxm:jaxb2-marshaller id="marshaller" contextPath=".....schema" />

   <bean id="annotationMapping"      class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping">
        <property name="interceptors">
            <list>
                <bean class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor" />
                <bean class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor">
                    <property name="xsdSchemaCollection"
                        ref="schemaCollection" />
                    <property name="validateRequest" value="true" />
                    <property name="validateResponse" value="true" />
                </bean>
            </list>
        </property>
        <property name="order" value="1" />
    </bean>

    <sws:marshalling-endpoints />

それが何らかの形で役立つことを願っています。Endpointクラスには@Endpoint、メソッド@PayloadRootがありました。それらは長くは戻りませんでしたが、クラスをJAXBElementでラップする必要もありませんでした。

[編集]名前空間

    xmlns:oxm="http://www.springframework.org/schema/oxm"
    xmlns:sws="http://www.springframework.org/schema/web-services"

    xsi:schemaLocation="
       http://www.springframework.org/schema/oxm 
       http://www.springframework.org/schema/oxm/spring-oxm-1.5.xsd">
于 2009-11-12T15:20:29.200 に答える