Я пытаюсь создать простой веб-сервис на основе Spring, который поддерживает «публикацию» с содержимым XML.
Весной я определяю AnnotationMethodHandler:
<bean id="inboundMessageAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<util:list>
<bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
<property name="marshaller" ref="xmlMarshaller"/>
<property name="unmarshaller" ref="xmlMarshaller"/>
</bean>
</util:list>
</property>
</bean>
И XML-маршаллер на основе jaxb:
<bean id="xmlMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="contextPaths">
<array>
<value>com.company.schema</value>
</array>
</property>
<property name="schemas">
<array>
<value>classpath:core.xsd</value>
</array>
</property>
</bean>
Мой контроллер помечен следующим образом, где «Ресурс» - это класс, автоматически сгенерированный jaxb:
@RequestMapping(method = POST, value = "/resource")
public Resource createResource(@RequestBody Resource resource) {
// do work
}
Результатом вызова веб-службы всегда является «HTTP / 1.1 415 Unsupported Media Type». Вот пример вызова службы:
HttpPost post = new HttpPost(uri);
post.addHeader("Accept", "application/xml");
post.addHeader("Content-Type", "application/xml");
StringEntity entity = new StringEntity(request, "UTF-8");
entity.setContentType("application/xml");
post.setEntity(entity);
Мне кажется, что я устанавливаю правильный тип носителя везде, где это возможно. У кого-нибудь есть идеи?
Редактировать: после дальнейшей отладки создается впечатление, что он никогда не добирается до попытки демонтажа объекта. Я не совсем понимаю черную магию, объясняющую, как AnnotationMethodHandler знает, что что-то типа application / xml должно идти в MarshallingHttpConverter. Кто-нибудь может пролить свет на это?