Spring boot:如何使 ContentType 标头完全可选?如果未通过,它会抛出 HttpMediaTypeNotSupportedException

Posted

技术标签:

【中文标题】Spring boot:如何使 ContentType 标头完全可选?如果未通过,它会抛出 HttpMediaTypeNotSupportedException【英文标题】:Spring boot : How to make ContentType header purely optional? It throws a HttpMediaTypeNotSupportedException if not passed 【发布时间】:2021-04-02 17:33:35 【问题描述】:

即使没有传递 ContentType 标头,我也希望我的应用程序能够正常工作。就我而言,请求正文始终是 JSON。但是下面的代码总是抛出异常

org.springframework.web.HttpMediaTypeNotSupportedException:不支持内容类型“application/x-www-form-urlencoded;charset=UTF-8”

public class UserController 
    @PostMapping(value = "/updateUser", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> updateUserDetails(@RequestBody User user) 
        //Do something
    

这是意料之中的,但即使在创建自定义配置后,它也会给出相同的错误:

@Configuration
public class MyWebConfig implements WebMvcConfigurer 

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) 
        configurer.defaultContentType(MediaType.APPLICATION_JSON);
    

如果我传递我想要使其成为纯可选的 ContentType 标头,这将正常工作。请帮忙。

【问题讨论】:

你有没有尝试在你的配置类中添加注解@EnableWebMvc? 您的控制器类是否标有@RestController 注解? @Andrian:是的。它用 RestController 注释,我确实在配置中尝试了 EnableWebMvc 标记。不过运气不好。 【参考方案1】:

这个问题可能是因为User对象不能有任何getter/setter

【讨论】:

它拥有所有的 getter 和 setter,包括一个无参数的构造函数。请注意,如果我传递内容类型标头,它工作正常。这意味着转换不是这里的问题。

以上是关于Spring boot:如何使 ContentType 标头完全可选?如果未通过,它会抛出 HttpMediaTypeNotSupportedException的主要内容,如果未能解决你的问题,请参考以下文章

如何有选择地使一个类成为应该在 Spring (Spring Boot 2.x) 中运行的代码

如何使 WebFilter 在非 WebFlux/非反应式 Spring Boot 应用程序中工作?

spring boot 结合啥前端框架

如何使我的Spring Boot微服务使用HTTPS运行?

如何理解spring boot中的微服务架构的体现

如何使`@Endpoint(id = "health")` 在 Spring Boot 2.0 中工作?