使spring boot json enum反序列化严格,因此它不会自动将无效值转换为null

ih99xse1  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(578)

我正在使用javaspringboot@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 enum反序列化器全局设置为“严格模式”,因此如果值无效,它会抛出异常?如果是,如何和在哪里?

uttx8gqw

uttx8gqw1#

默认情况下应禁用该功能。
但是如果你想显式地设置它,你可以这样做:
在您的房产中:

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引导版本?

相关问题