我想解码 Java Enum 中的普通值和数组中的小写和大写值。
我试过这段代码:
public enum FooBarEnum {
FOO,
BAR
}
以下 POJO 来反序列化事物:
public record Aaa(String something, FooBarEnum foobar)
public record Bbb(String something, List<FooBarEnum> foobarList)
尝试通过 HTTP 请求获取对象时:
@GetExchange("/api/test1")
Aaa getAaa(@PathVariable int key);
为此,它是有效的,无论服务器是否响应带有 FOO、foo、BAR 或 bar 的对象,它都是有效的。
但是,我有这个:
@GetExchange("/api/test2")
Bbb getBbb(@PathVariable int key);
当它是小写时,我会遇到这个异常:
JSON decoding error: Cannot deserialize value of type `com.FooBarEnum` from String "foo": not one of the values accepted for Enum class: [FOO, BAR]
[...]
Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `com.FooBarEnum` from String "foo": not one of the values accepted for Enum class: [FOO, BAR]
at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 996] (through reference chain: com.Bbb["fooBarList"]-java.util.ArrayList[0])
at com.fasterxml.jackson.databind.exc.InvalidFormatException.from(InvalidFormatException.java:67) ~[jackson-databind-2.18.3.jar:2.18.3]
我甚至尝试添加
@JsonFormat(with = {JsonFormat.Feature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, JsonFormat.Feature.ACCEPT_CASE_INSENSITIVE_VALUES})
但没有运气。
有没有办法处理数组的忽略大小写?
这是一个奇怪的行为。默认情况下,Jackson 使用相应常量的名称序列化和反序列化枚举值。这就是为什么
FOO
和BAR
是序列化过程中生成的唯一值,也是反序列化时接受的唯一值。下面是一个展示此行为的示例。在您的案例中,必须缺少使端点正常getAaa()
工作的配置。相反,getBbb()
它的行为符合预期。正如您已经提到的,注释
@JsonFormat
以及功能ACCEPT_CASE_INSENSITIVE_PROPERTIES
和ACCEPT_CASE_INSENSITIVE_VALUES
将反序列化,无论大小写如何。但是,它必须注释枚举字段。我不知道您是否使用了类而不是记录并注释了其他内容。不清楚您如何使用问题帖子中的注释。这是一个具有所需行为的演示。另一种方法是定义自定义反序列化器并将其注册到模块上
ObjectMapper
。这是另一个演示。