使 Spring Boot JSON 枚举反序列化变得严格,因此它不会默默地将无效值转换为 null

问题描述

我将 Java Spring Boot @RestController 与包含枚举字段的对象一起使用。 Spring 会自动将 JSON 反序列化为 MyRequest 对象。

@RestController
public class MyController {
    @PostMapping(path = "/operation")
    public ResponseEntity<MyResponse> operation(@Valid @RequestBody MyRequest request) {
        ...
    }
}

public class MyRequest {
    private MyEnum1 field1;
    private MyEnum2 field2;
    private MyEnum3 field3;
    private MyEnum4 field4;
    private MyEnum5 field5;
    private MyEnum6 field6;
    ... // really a lot of varIoUs enum fields!
}

public enum MyEnum1 {
    VAL1,VAL2,VAL3;
}

问题在于,如果 JSON 包含完全无效的 enum 字段值,反序列化器会地将它们转换为 null,没有任何异常。

{
    "field1": "BLAHBLAH",...
}

这对用户不友好且危险。

我知道我可能会为每个枚举编写自定义的 JSON 反序列化器,但该解决方案既麻烦又不优雅。

有没有办法将 JSON 枚举反序列化器全局设置为“严格模式”,所以如果该值无效它会抛出异常?如果是这样,如何以及在哪里?

解决方法

默认情况下应禁用该功能。

但是如果你想明确设置它,你可以这样做:

在您的属性中:

spring.jackson.deserialization.read-unknown-enum-values-as-null=false

或者作为配置类中的替代方案(实际上任何 bean 都可以工作,只要确保它早点发生):

@Autowired
public void configureJackson(ObjectMapper objectMapper) {
   objectMapper.disable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL);
}

因为默认情况下它实际上应该是这样的,我想知道为什么它不适合你。你在某处启用它吗?您使用的是哪个 Spring Boot 版本?