【问题标题】:post xml to Spring REST server returns Unsupported Media Type将 xml 发布到 Spring REST 服务器返回不支持的媒体类型
【发布时间】:2011-01-25 04:42:51
【问题描述】:

我正在尝试创建一个简单的基于 spring 的 web 服务,它支持带有 xml 内容的“post”。

在春天,我定义了一个 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>

我的控制器注释如下,其中“资源”是由 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 背后的黑魔法。任何人都可以对此有所了解吗?

【问题讨论】:

    标签: java spring rest spring-mvc jaxb


    【解决方案1】:

    最可能的原因是 JAXB 上下文不知道如何解组到 Resource 对象。

    Resource@XMLRootElement 注释吗?如果不是,那么Jaxb2Marshaller 将不接受该参数,您将收到 415 错误。这是通过从 Sprng 委托给 JAXB 运行时完成的,Spring 在这件事上并没有太多发言权。

    edit:数据到@RequestBody 参数的实际强制转换在HandlerMethodInvoker.resolveRequestBody() 中完成。在匹配之前必须满足很多条件,包括匹配 MIME 类型和参数类类型,如果失败,则没有日志记录,只有 HTTP 415。查看该方法的源,而且更好的是,进行一些远程调试以查看您的设置逻辑在哪里失败。

    【讨论】:

    • 感谢您的建议,斯卡夫曼。我检查了一下,该类确实有一个 @XMLRootElement 标记。
    • @Mayra:Resourcecom.company.schema 包中?尝试编写一个单元测试,用你的配置构造一个Jaxb2Marshaller,并确保support(Resource.class) 返回true。在您进一步了解之前,这需要工作。
    • 没有骰子,我创建了一个 Jaxb2Marshaller 对象,设置了我在 spring 文件中的 contextPath 和模式,它说它支持我的类。
    • @skaffman:谢谢,这让我找到了正确的答案!原来它与该配置无关,服务器中其他地方的 AnnotationMethodHandler 的另一个定义与我的定义冲突。
    • @Mayra:很高兴听到这个消息。它必须在某个地方:)
    猜你喜欢
    • 2019-11-26
    • 2014-09-15
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2013-05-27
    相关资源
    最近更新 更多