java - 如何在不使用@JsonCreator的情况下将请求参数中的整数转换为枚举类型字段的枚举?
问题描述
在我们的项目中,我们定义如下枚举
public enum GenderEnum implements IEnum{
MALE(1),
FEMALE(2);
private Integer code;
GenderEnum(int code) {
this.code = code;
}
public static GenderEnum getByCode(int code) {
for (GenderEnum genderEnum : values()) {
if (genderEnum.code == code) {
return genderEnum;
}
}
return null;
}
}
我们想在用于参数的类中使用这些枚举,例如
public class Param{
String id;
GenderEnum gender;
}
我们有像这样的控制器
@RestController
class MyController{
@PostMapping('/alink')
ResponseBean doSomething(@RequestBody Param param){
...
}
}
对于上述情况,当请求正文为
{"id":"L323", "gender":1}
我们希望1
可以转换成枚举MALE
一种解决方案是添加@JsonCreator
over getByCode(int code)
。但是在我们现有的项目中,存储库层将 enum 转换为其 String 值(MALE
或FEMALE
)而不是code
value,然后再将它们插入数据库。因此,如果我们添加@JsonCreator
over getByCode(int code)
,我们会在尝试从数据库中检索枚举时遇到错误。
我们如何使 mvc/controller 将输入的整数值转换为枚举而不影响存储库层?
我看到一个解决方案如下:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverterFactory(new EnumConverterFactory());
}
}
static class EnumConverterFactory implements ConverterFactory<Integer, IEnum> {
@Override
public <T extends IEnum> Converter<Integer, T> getConverter(Class<T> targetType) {
if (!targetType.isEnum()) {
throw new UnsupportedOperationException(targetType + "is not enum");
}
return new EnumConverter(targetType);
}
private static class EnumConverter<T extends IEnum> implements Converter<Integer, T> {
private final Class<T> enumType;
public EnumConverter(Class<T> enumType) {
this.enumType = enumType;
}
@Override
public T convert(Integer code) {
for (T t : enumType.getEnumConstants()) {
if (code.equals(t.getCode())) {
return t;
}
}
return null;
}
}
}
但这个解决方案不起作用。调试时,我注意到参数的解析取决于杰克逊的序列化(它根据序数而不是代码值将整数转换为枚举),并且根本不涉及转换器。
那么,有什么解决方法吗?
解决方案
您可以在控制器中声明用于特定类型参数的自定义映射的方法:
@InitBinder
public void initBinder(WebDataBinder dataBinder) {
dataBinder.registerCustomEditor(GenderEnum.class,
new PropertyEditorSupport() {
@Override
public void setAsText(String value){
setValue(GenderEnum.getByCode(Integer.parseInt(value));
}
});
}
推荐阅读
- php - MySQL:将 100 个随机数的列表插入一个字段然后显示它们
- javascript - 用于查找最高质数的 Javascript 程序
- ruby-on-rails - 对如何正确设置和使用关联感到困惑
- python - 为什么我从库 `stdlib_list` 中丢失了一个文件?
- asp.net-web-api - 401 未经授权使用 Javascript 访问 Web API
- jsoup - 使用 Jsoup 解析 HTML 以获取单个元素的文本
- python - 如何导入脚本?
- php - 如何循环遍历这个数组?
- r - 如何找到数据框或矩阵的最小值/最大值的位置(行/列)(R问题)
- node.js - 如何为嵌套在多个数组和对象中的对象显示 forEach