spring-boot - 使用 @JsonValue 的枚举反序列化不适用于 int 值。它使用索引值而不是实际值
问题描述
使用完成的枚举转换@JsonValue
不适用于杰克逊中的int值。在转换期间,它使用枚举索引值而不是实际值。@JsonValue
属性适用于字符串枚举
我正在使用 Spring Boot 2.2.2.RELEASE
控制器
@PostMapping("/test")
public ResponseEntity enumTest(@RequestBody Request request ){
log.info(request.toString());
return ResponseEntity.status(HttpStatus.OK).build();
}
请求对象
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Request {
private IntEnum intEnum;
private StringEnum stringEnum;
}
String Enum //@jsonValue 适用于 StringEnum 类
public enum StringEnum {
FIRST("first"),SECOND("second");
@JsonValue
private final String stringValue;
StringEnum(String second) {
this.stringValue=second;
}
}
整数枚举
public enum IntEnum {
ONE(1), TEN(10);
@JsonValue
private final int intValue;
IntEnum(int i) {
this.intValue = i;
}
}
@jsonValue
不适用于 intEnum 类,
如果我在请求中传递 1 它正确地转换为枚举值ONE
但是如果我在请求中传递 10 它说
index value outside legal index range [0..1]; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `com.example.demo.IntEnum` from number 10: index value outside legal index range [0..1]\n at [Source: (PushbackInputStream); line: 2, column: 15] (through reference chain: com.example.demo.Request[\"intEnum\"])",
json请求
{
"intEnum":10,
"stringEnum":"first"
}
解决方案
我能够使用For @JsonValue 和整数让它工作我们需要显式添加 JsonCreator@JsonCreator
public enum IntEnum {
ONE(1), TEN(10);
@JsonValue
private final int intValue;
IntEnum(int i) {
this.intValue = i;
}
@JsonCreator
public static IntEnum fromNumber(int number) {
for (IntEnum b : IntEnum.values()) {
if (b.intValue == number) {
return b;
}
}
return null;
}
}