SpringBoot Rest接口异常:不支持Content-Type 'application/json;charset=UTF-8'
向RestController发送POST或PUT请求时,抛出异常:Content-Type 'application/json;charset=UTF-8' is not supported。未使用Jackson(Stack Overflow同类问题多通过Jackson解决)。
已做排查:
- 其他类似请求可正常工作,差异在于User相关类包含其他对象引用(
List<AddressDto>、List<OrderDto>、CartDto),推测问题出在此处 - 尝试过调试、移除校验注解,请求始终无法进入方法
- 指定
@PostMapping(consumes = "application/json;charset=UTF-8")无效 - 移除这些对象引用后接口恢复正常
相关代码:
Controller代码
@RequestMapping("/api/v1/users") @RestController @RequiredArgsConstructor @Validated public class UserController { private final UserService userService; @PutMapping @Validated(UserDto.OnUpdate.class) public void save(@Valid @RequestBody UserDto userDto) { User user = UserMapper.INSTANCE.toEntity(userDto); userService.save(user); } @PostMapping @Validated(UserDto.OnCreate.class) public UserDto create(@Valid @RequestBody UserDto userDto) { User userToBeCreated = UserMapper.INSTANCE.toEntity(userDto); User user = userService.create(userToBeCreated); return UserMapper.INSTANCE.toDto(user); } }
UserDto代码
@Data @JsonIgnoreProperties({"password", "passwordConfirmation"}) public class UserDto { @Null(message = "Id must be null", groups = {OnCreate.class}) @NotNull(message = "Id must not be null", groups = {OnUpdate.class}) private Long id; @NotNull(message = "Name is required", groups = {OnCreate.class, OnUpdate.class}) @Length(min = 3, max = 45, message = "Username must be between {min} and {max} characters", groups = {OnCreate.class, OnUpdate.class}) private String name; @NotNull(message = "Email is required", groups = {OnCreate.class, OnUpdate.class}) @Length(min = 3, max = 45, message = "Email must be between {min} and {max} characters", groups = {OnCreate.class, OnUpdate.class}) @Email(message = "Email must be valid") private String email; @NotNull(message = "Phone number is required", groups = {OnCreate.class, OnUpdate.class}) @Length(min = 3, max = 45, message = "Phone number must be between {min} and {max} characters", groups = {OnCreate.class, OnUpdate.class}) private String phoneNumber; @NotNull(message = "Password is required", groups = {OnCreate.class, OnUpdate.class}) @Length(min = 6, message = "Password must be longer than {min} characters", groups = {OnCreate.class, OnUpdate.class}) private String password; @NotNull(message = "Password confirmation is required", groups = {OnCreate.class}) @Length(min = 6, message = "Password confirmation must be longer than {min} characters", groups = {OnCreate.class}) private String passwordConfirmation; private List<AddressDto> addresses; private List<OrderDto> orders; private CartDto cart; private LocalDate createdAt; public interface OnCreate { } public interface OnUpdate { } }
User实体类代码
@Data public class User { private Long id; private String name; private String email; private String password; private String passwordConfirmation; private String phoneNumber; private List<Address> addresses; private List<Order> orders; private Cart cart; private LocalDateTime createdAt; }
核心原因是嵌套的DTO/实体类缺少对应的序列化/反序列化支持(Spring默认JSON处理依赖Jackson,即便未显式配置也会默认使用),以下是具体解决步骤:
检查嵌套类的基础配置
确保AddressDto、OrderDto、CartDto以及对应的Address、Order、Cart类都添加了@Data注解(或手动生成getter/setter),序列化/反序列化框架需要通过这些方法访问属性。如果嵌套类包含日期、枚举等特殊类型,需添加@JsonFormat等注解指定处理规则。确认JSON依赖完整性
检查项目依赖是否包含spring-boot-starter-web(它默认集成Jackson核心包);若手动管理依赖,需确保jackson-databind、jackson-annotations、jackson-core三个包存在且版本一致。处理循环引用问题
如果User与嵌套类(如Address)存在双向引用,会导致序列化失败。可在关联字段上添加@JsonIgnore,或用@JsonManagedReference/@JsonBackReference组合标记双向关系,避免循环解析。全局序列化配置(可选)
若嵌套类有统一序列化需求,可创建全局配置类统一处理:@Configuration public class WebConfig implements WebMvcConfigurer { @Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); // 配置Java 8日期类型序列化 mapper.registerModule(new JavaTimeModule()); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // 忽略请求中未知字段,避免反序列化失败 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); return mapper; } }
内容的提问来源于stack exchange,提问作者Ilya Lisov

