我将尝试创建一个基于Spring的简单Web服务,支持使用XML内容进行“post”请求。
在Spring中,我定义了一个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>
还有一个基于JAXB的XML编组器:
<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>
我的控制器如下所示,其中“Resource”是由jaxb自动生成的类:
@RequestMapping(method = POST, value = "/resource")
public Resource createResource(@RequestBody Resource resource) {
// do work
}
调用webservice的结果总是“HTTP/1.1 415不支持的媒体类型”。下面是一个示例服务调用:
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。 有人可以解释一下吗?
Resource
在com.company.schema
包中吗?尝试编写一个单元测试,使用您的配置构造一个Jaxb2Marshaller
,并确保support(Resource.class)
返回true
。在您能够进一步操作之前,这是必须要工作的。 - skaffman