当前位置: 首页 > 知识库问答 >
问题:

SpringBoot控制器返回XML,尽管内容类型显式设置为JSON

施阳曜
2023-03-14

我有2个Spring引导REST服务,它们作为生产者和消费者进行交互。一个是JSON内容的生产者,另一个是消费者。

在消费者服务中,我使用Spring的RestTemplate调用生产者的endpoint并获得结果。

控制器POSTendpoint的生产者相关代码如下:

@RequestMapping(value = "/cars", method = RequestMethod.POST)
public ResponseEntity<Cars> getCars(/* methods params */) {
    // some code here
    HttpHeaders respHeader = new HttpHeaders();
    respHeader.set("Content-Type", "application/json");
    ResponseEntity<Cars> resp = new ResponseEntity<Cars>(cars, respHeader, HttpStatus.OK);
    
    return resp;
} 

上述生产商代码中的注意事项:

  • 我没有在RequestMapping注释中明确指定products=“application/json”
  • 然而,我在响应头中将内容类型设置为“application/json”

但是消费者以XML而不是JSON获取响应。Jackson在班级小路上。

如何解释返回XML而不是JSON,即使内容类型在响应标头中显式设置为“应用程序/json”?

假设响应头没有任何效果,那么默认值是什么?是XML而不是JSON吗?

共有2个答案

狄赞
2023-03-14

您可以在Spring的ContentTypeServer atingMessageConverter中设置断点并调试以查看已解析的消息转换器以获取响应。

web客户端和服务器之间确定响应内容类型的概念和过程称为内容协商。

自Spring MVC以来,注册的WebMVCConfiguer和HttpMessageConverters负责响应的表示和内容类型。

在SpringBoot中,这些是自动配置的。

对于任何@RestController或具有@响应体的控制器endpoint,响应的默认内容类型是XML,如果Jackson在类路径中可用并自动配置成功,则默认内容类型应该是JSON。

另请参见:

  • 贝尔东指南:SpringMVC内容协商
元玮
2023-03-14

您可以通过自定义Spring的WebMvcConfigrer来配置任何响应的默认内容类型。

为此,请将以下代码添加到带有配置注释的给定配置类中:

@Bean
public WebMvcConfigurer customConfigurer() {
    return new WebMvcConfigurer() {
        @Override
        public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
            configurer.defaultContentType(MediaType.APPLICATION_JSON);
        }
    };
}
 类似资料:
  • null 当我创建正文部分时,我是否应该显式地设置top mime消息的内容类型,然后设置每个正文部分? 如果是,在上面的例子中它们应该是什么? 对于html建议,对于附件建议,对于内联建议。我正在使用所有这些,那么对于完整的消息和不同的主体部分应该是什么内容类型? 通过上面的代码,我得到了正确的html文本,纯文本,内联图像和附件在正确的地方与James集成的ThunderBird。 因此,我不

  • 我实现了一个API,它将根据客户的请求返回JSON和XML(即接受请求中的头)。它像预期的那样工作。 这里的问题是:即使用户发送接受标头,在一些特殊情况下(即业务逻辑),我们也需要动态发送响应内容类型。我试图使用HttpHeaders实现它,但它不起作用。 我将HTTP状态设置为200,但响应为错误,即, 如何解决这个问题?

  • 我得到这个错误消息: 无法写入JSON: 未找到用于java.io.FileDescriptor类的序列化程序,也未发现用于创建BeanSerializer的属性 (为了避免异常,禁用SerializationFeature.fail_on_empty_beans)) (通过引用链: org.springframework.core.io.filesystemResource[\“outputSt

  • 当我尝试向某个endpoint发送sparql查询时,例如: 我明白了 这不是唯一一个我无法向其发送查询的endpoint, 我应该怎么做才能在其他内容类型中获得结果?我试着用谷歌搜索它,但我发现如果我将查询发送到错误的html(不是sparqlendpoint),就会发生这种情况,但是http://data.open.ac.uk/sparql是一个好的endpoint,我通过python向它发送

  • 我想强制内容类型为application/json,但我有一个模式“no cors”,实际上内容类型的返回是:text/plain;charset=UTF-8传递头时是一样的,所以我不知道怎么做。 我已经尝试过使用fetch或Axios,URL在HTTP中,我在本地工作,所以可能是问题所在?我试过邮递员,效果很好。 所以,我想要的内容类型是:application/json,而不是内容类型:tex

  • 问题内容: 使用JavaFX Scene Builder时遇到以下问题… 鉴于: 文件fxml,包含描述锚定窗格(由Scene Builder形成的fxml); 未为“锚定窗格”指定控制器类。 使用FXMLLoader将此fxml加载到Java应用程序中。 需要: 下载锚定窗格后,将值设置为Controller Class。 必须使用不同的处理程序加载相同的fxml。 问题: 是否可能?如果可以,