Springboot Controller返回XML,尽管内容类型将其明确设置为JSON



我有2个春季启动休息服务,它们作为生产者和消费者相互作用。一个是JSON内容的生产商,另一个是消费者。

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

代码

制作人对Controller的端口端点的相关代码如下:

@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注释中没有明确指定produces="application/json"
  • 但是,我将内容类型设置为"应用/json"在响应标题中。

问题

,但消费者在XML而不是JSON中获得响应。杰克逊在班级路径中。

问题

即使内容类型明确设置为" application/json??

(,什么解释了返回XML而不是JSON

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

看来httpmessageconverters的顺序很重要。当存在传递XML依赖关系时,我遇到了默认XML响应的同样问题。将MappingJackson2HttpMessageConverter添加到转换器列表的顶部为我解决。

由于某种原因,configurer.defaultContentType(MediaType.APPLICATION_JSON)此建议中的建议破坏了产生JSON以外的媒体类型的API(当请求不包含Accept标头时(。这些API开始以JSON为DefaultContentType

开始返回HTTP状态406

我的春季启动版本是2.7.1

这是配置类:

@Configuration
@RequiredArgsConstructor
public class WebMvcConfiguration implements WebMvcConfigurer {
  private final ObjectMapper objectMapper;
  @Override
  public void extendMessageConverters(@NotNull List<HttpMessageConverter<?>> converters) {
    converters.add(0, new MappingJackson2HttpMessageConverter(objectMapper));
  }
}

未定义默认内容类型时,XML将成为默认值,因为Spring在转换器上迭代以决定可生产的内容类型。并且由于在JSON转换器之前添加XML转换器,因此它使用XML。在XML转换器之前添加JSON转换器修复了此操作。

您可以通过自定义Spring的WebMvcConfigurer

这样做,将以下代码添加到用@Configuration注释的给定配置类:

@Bean
public WebMvcConfigurer customConfigurer() {
    return new WebMvcConfigurer() {
        @Override
        public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
            configurer.defaultContentType(MediaType.APPLICATION_JSON);
        }
    };
}

您可以在春季的ContentTypeDelegatingMessageConverter中设置一个断点,然后调试以查看已解决的消息 - 连接器的响应。

内容谈判

确定响应内容类型的Web-Client和-Server之间的概念和过程称为内容 - 访问。

自春季MVC以来,注册的WebMvcConfigurerHttpMessageConverters负责响应的表示和内容类型。

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

对于任何@RestController或具有@ResponseBody的控制器 - 端口,响应的默认内容类型为XML,如果jackson在classPath中可用并且已成功进行自动配置,则默认内容类型应为JSON。

>

另请参见:

  • baeldung的教程:春季MVC内容谈判
  • 如何使Spring Boot默认为应用程序/JSON; CHARSET = UTF-8而不是应用程序/JSON; CHARSET = ISO-8859-1

相关内容

  • 没有找到相关文章

最新更新