使 Spring Boot JSON enum 反序列化严格,因此它不会默默地将无效值转换为 null
Make Spring Boot JSON enum deserialization strict, so it does not silently convert invalid values into 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
或者作为配置 class 的替代方案(实际上任何 bean 都可以工作,只要确保它早点发生):
@Autowired
public void configureJackson(ObjectMapper objectMapper) {
objectMapper.disable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL);
}
因为默认情况下它实际上应该是这样的,我想知道为什么它不适合你。你在某处启用它吗?您使用哪个 Spring 引导版本?
我正在使用 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
或者作为配置 class 的替代方案(实际上任何 bean 都可以工作,只要确保它早点发生):
@Autowired
public void configureJackson(ObjectMapper objectMapper) {
objectMapper.disable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL);
}
因为默认情况下它实际上应该是这样的,我想知道为什么它不适合你。你在某处启用它吗?您使用哪个 Spring 引导版本?