Jaxb2Marshaller и примитивные типы

Можно ли создать операцию веб-службы с использованием примитивных или базовых типов Java при использовании Jaxb2Marshaller в 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>

person Thomas Einwaller    schedule 12.11.2009    source источник
comment
Можете ли вы опубликовать свою конфигурацию spring xml? У меня была похожая проблема, и я решил ее с помощью конфигурации ... это было некоторое время назад, но если вы опубликуете свой, я могу проверить, какой была моя правильная конфигурация, и опубликовать различия.   -  person laura    schedule 12.11.2009


Ответы (2)


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

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

person skaffman    schedule 12.11.2009
comment
Итак, как лучше всего использовать spring ws с подходом «сверху вниз»? Я хочу использовать maven для создания необходимых классов, поэтому мне просто нужно реализовать интерфейс веб-службы. - person Thomas Einwaller; 12.11.2009
comment
Я не знаю ни одного инструмента генерации, который бы это делал, но Spring-WS очень легкий код, так что вы не сэкономите столько времени на наборе текста. - person skaffman; 12.11.2009
comment
так что вы бы порекомендовали использовать снизу вверх и просто написать мой код моего интерфейса веб-службы? - person Thomas Einwaller; 12.11.2009
comment
Spring-WS рекомендует сначала написать вашу XML-схему, а затем написать конечные точки в java, которые получают и отвечают документами, соответствующими этой схеме. WSDL естественным образом выпадает из этого процесса. - person skaffman; 12.11.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">
person laura    schedule 12.11.2009