【问题标题】:Spring Boot Unsupported Media TypeSpring Boot 不支持的媒体类型
【发布时间】:2017-09-22 14:39:32
【问题描述】:

我正在使用 Spring Boot 构建一些 API,但是当我尝试使用 Postman 进行查询时,我遇到了一些关于 Content-Type 的错误。

@RequestMapping(path = "/verify", method = RequestMethod.POST, consumes = "text/xml", produces = "application/json")
    String verify(@RequestBody Map<String, Object> payload, HttpServletRequest request) {}

我不明白问题出在哪里。

我注意到当我删除 @RequestBody 作为方法的参数时,错误消失了。为什么?

我只想:

  • 向 API 发送 XML
  • 从 API 接收 JSON

【问题讨论】:

  • 将消费 = "text/xml" 改为消费 = "application/xml"
  • 对不起,不工作。在主帖中查看我的最新更新。
  • 能否也显示请求中的 Accept 标头?

标签: java spring spring-boot


【解决方案1】:

如果您收到与 Content-Type 相关的错误,那么我肯定假设您使用 HTTP REST 作为组件之间通信的手段。

Content-TypeHTTP REST 中的 Content Negotiation 主题相关。

HTTP REST 中的

Content Negotiation 主题意味着客户端和服务必须就表示媒体类型达成一致。即他们需要就如何相互通信达成一致,双方之间发送和接收的每个有效载荷的内容是什么。

客户端通过Accept header

指定它想要什么

服务器指定通过Content-Type header

产生什么

【讨论】:

  • 你是对的,我设置@RequestMapping(value = "/finding", produces = { MediaType.APPLICATION_JSON_VALUE })检查你的产品价值
【解决方案2】:

在您的 application.properties 中添加以下行:

logging.file = myapp.log

重新启动服务器,发出请求。检查 myapp.log 以找出失败的原因。 对我来说,我收到了这个错误:


2018-05-08 07:08:34.404 WARN 348 --- [http-nio-8080-exec-5] .cjMappingJackson2HttpMessageConverter:无法评估类型 [[简单类型,com.atta 类的 Jackson 反序列化。 entity.User]]:com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法处理托管/反向引用'defaultReference':反向引用类型(java.util.List)与托管类型(com.atta.entity.州)

【讨论】:

    【解决方案3】:

    尝试将 jackson-dataformat-xml 依赖项添加到您的类路径,或者如果您使用构建工具来构建 maven (pom.xml) 或 gradle (build.gradle)。

    注意:您可以通过 ... consumes = { "text/xml", "application/xml" } ... 同时支持 text/xmlapplication/xml

    注意:您可以使用MediaType 成员代替字符串:... consumes = { MediaType.APPLICATION_XML, MediaType.TEXT_XML } ...

    【讨论】:

    • 我会尝试添加依赖。对于其他建议,您没有看到发布的代码吗?已经有消费/生产属性。 MediaType 常量或纯字符串不会改变最终结果。
    • @AndreaLimoli 我更新了我的答案以使其更清晰。很抱歉我之前介绍的混乱。我想指出,您可以使用多种引用 XML 的内容类型,并且您可以使用 MediaType 而不是编写字符串。这些是旁注。
    【解决方案4】:

    尝试在邮递员中将 Http Header Content-Type 设置为 text/xml。 您还可以在 Chrome DevTools -> 网络选项卡 -> 单击您的请求 -> 标题选项卡中检查当前的 Content-Type 标头是什么。

    【讨论】:

    • 在 Postman 上,内容类型将根据您选择的正文格式自动插入标题中。发现发送什么内容类型没有问题,因为 Spring 清楚地回答。我在请求中传递的内容类型不受支持。为什么?
    • 不确定邮递员是如何工作的,但 415 错误清楚地表明 Content-Type 服务中预期的内容与客户端发送的内容不匹配。尝试 Chrome devtools 找出请求标头中发送的内容类型是什么。也尝试使用 cURL
    【解决方案5】:

    改变

    1) 邮递员对application/json的请求header的值

    2) 来自

    consumes = "text/xml"
    

    "application/json"
    

    【讨论】:

      【解决方案6】:

      在我的情况下,我的 JSON 属性映射不正确,导致相同的异常

      @JsonProperty("Total")
      private List<XXX> SafeMembers;
      

      我将 JSON 属性映射到 Total 而不是 SafeMembers。我改变如下

      @JsonProperty("SafeMembers")
      private List<XXX> SafeMembers;
      

      【讨论】:

        猜你喜欢
        • 2020-06-26
        • 2021-12-21
        • 1970-01-01
        • 2019-07-01
        • 2017-06-21
        • 1970-01-01
        • 1970-01-01
        • 2021-10-12
        • 2022-12-09
        相关资源
        最近更新 更多