报错信息:
其它异常:JSON parse error: Cannot deserialize value of type `com.xxx.enums.UserTypeEnum` from number 2: index value outside legal index range [0..1];
nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `com.xxx.enums.UserTypeEnum` from number 2: index value outside legal index range [0..1]\n at [Source: (PushbackInputStream); line: 7, column: 15] (through reference chain: com.xxx.user.UserInfoDto[\"userType\"])
举例
@RequiredArgsConstructor
@Getter
public enum TestEnum {
A("A", "一"),
B("B", "二"),
C("C", "三");
private final String value;
private final String convert;
}
@Data
public class TestReq {
private TestEnum anEnum;
}
@RestController
public class TestController {
@PostMapping("/test")
public TestReq test(@RequestBody TestReq testReq) {
return testReq;
}
}
三个类如上。此时,当我们传入
{“anEnum”:1}
响应为
{
“anEnum”: “B”
}
现象就是传入1的情况下,会使用下标来寻找Enum的实例。大多数情况是无伤大雅甚至说很人(hua)性(she)化(tian)的(zu),但是在我们想要强校验参数时候就需要避免这种情况了。
以上例子来自该博客:https://blog.csdn.net/karrbo/article/details/116013711
怎么优雅解决呢
使用@JsonCreator注解
改造成下面这样
@Getter
public enum TestEnum {
A("A", "一"),
B("B", "二"),
C("C", "三");
private static final Map<String, TestEnum> TEST_MAP = Stream
.of(TestEnum.values())
.collect(Collectors.toMap(s -> s.value, Function.identity()));
@JsonValue
private final String value;
private final String convert;
@JsonCreator
public static TestEnum fromString(String string) {
return Optional
.ofNullable(TEST_MAP.get(string))
.orElse(TestEnum.A);
}
}
问题得到解决。