Spring RestTemplate - не найдено подходящего HttpMessageConverter для типа ответа [..] и типа содержимого [application/xml]

У меня проблема с доступом к службе REST с помощью RestTemplate. Мне уже удалось использовать MarshallingConverter для доступа к еще одному сервису, и все работало нормально. Я скопировал эту функциональность и сгенерировал классы модели из полученной схемы XSD. Однако я получаю исключение, что подходящий конвертер не найден. Вот моя конфигурация (я использую Spring 3.0.6 в связи с Vaadin, если это имеет значение):

<bean id="marshallingConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
    <property name="marshaller" ref="jaxbMarshaller" />
    <property name="unmarshaller" ref="jaxbMarshaller" />
</bean>

<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="classesToBeBound">
        <list>
            ... here are my model classes ...
        </list>
    </property>
</bean>

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
    <property name="messageConverters">
        <list>
            <ref bean="marshallingConverter" />
        </list>
    </property>
</bean>

RestTemplate автоматически подключается к моей реализации клиентского класса службы. Что мне здесь не хватает? Я проверил ответ, и для типа содержимого задано значение application/xml, а классы модели были сгенерированы автоматически, поэтому конфигурация должна быть правильной. Спасибо за любую помощь.


person Filip Majernik    schedule 10.01.2012    source источник
comment
Еще одна вещь, я проверил входящий XML по схеме XSD, которую я использовал для создания классов модели, и все верно.   -  person Filip Majernik    schedule 10.01.2012
comment
Итак, я обнаружил, что проблема в том, что JAXB не может создать объект из входящего XML. Однако все классы моделей автоматически генерируются из схемы XSD с помощью инструмента xjc, и XML действителен для этой схемы. Очень странно. Похоже, что некоторые аннотации в классах моделей отсутствуют. У кого-нибудь была похожая проблема?   -  person Filip Majernik    schedule 13.01.2012


Ответы (1)


Так что я сделал эту работу. Часть проблемы заключалась в том, что в сгенерированных классах отсутствовала аннотация XmlRootElement. Подробнее об этом здесь. Поэтому я добавил аннотацию XJC в схему XSD и снова создал классы с помощью:

xjc -extension /path/to/schema

После этого все заработало (или, по крайней мере, я не получил никаких исключений при обработке XML), но элементы внутри корневого элемента не были демаршаллизованы, и я получил только реализацию XMLElement от парсера. Проблема заключалась в том (это было характерно для моего проекта), что определение элемента использовало xs:anyType в качестве типа элемента, который не может быть проанализирован. После того, как я изменил его на правильный тип элемента, все заработало как по маслу.

person Filip Majernik    schedule 13.01.2012