Jaxb2Marshaller и примитивные типы - PullRequest
2 голосов
/ 12 ноября 2009

Можно ли создать операцию веб-службы с использованием примитивных или базовых типов Java при использовании Jaxb2Marschaller в spring-ws? Например, метод выглядит следующим образом:

@Override
@PayloadRoot(localPart = "AddTaskRequest", namespace = "http://example.com/examplews/")
public long addTask(final Task task) throws AddTaskFault {
 // do something
 return 0;
}

Я использую плагин maven jaxws для генерации классов интерфейса и модели из моего WSDL. Когда я пытаюсь вызвать веб-сервис, я получаю следующую ошибку:

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 для генерации второго варианта интерфейса?

ОБНОВЛЕНИЕ: Мои соответствующие записи конфигурации 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>

Ответы [ 2 ]

4 голосов
/ 12 ноября 2009

Когда Spring-WS пытается сопоставить EndpointAdapter с Endpoint, он проверяет, что все параметры метода конечной точки плюс его возвращаемое значение являются типами, известными Jaxb2Marshaller и * 1004. * не буду. Концептуально это имеет смысл, так как JAXB не знал бы, как превратить long в XML без дополнительной информации (вот где появляется JAXBElement).

Вы должны понимать, что Spring-WS не реализация JAX-WS и не претендует на это. Вы не можете ожидать, что возьмете сгенерированные JAX-WS артефакты и будете ожидать, что они просто будут работать в Spring_WS, хотя во многих случаях Spring-WS достаточно гибок, чтобы с ним справиться.

0 голосов
/ 12 ноября 2009

Вот все, что относится к моей конфигурации, так как я не могу точно сказать, что вы можете изменить, они довольно разные, и прошло уже полтора года с тех пор, как я это сделал.

    <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">
...