Java 如何在不使用@JsonCreator的情况下,将请求参数中的整数转换为枚举类型的字段的枚举?
在我们的项目中,我们定义如下枚举Java 如何在不使用@JsonCreator的情况下,将请求参数中的整数转换为枚举类型的字段的枚举?,java,spring,spring-boot,spring-mvc,enums,Java,Spring,Spring Boot,Spring Mvc,Enums,在我们的项目中,我们定义如下枚举 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()
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可以转换为enum MALE
一种解决方案是在getByCodeint代码上添加@JsonCreator。但在我们现有的项目中,存储库层在将enum插入数据库之前将其转换为字符串值Male或Male,而不是代码值。所以,若我们在getByCodeint代码上添加@JsonCreator,那个么在尝试从数据库检索枚举时会遇到错误
如何让mvc/controller在不影响存储库层的情况下将输入的整数值转换为enum
我认为解决方案如下:
@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;
}
}
}
但这个解决方案不起作用。调试时,我注意到参数的解析取决于Jackson的Serialization,它根据序号(而不是代码值)将整数转换为枚举,并且转换器根本不涉及
那么,有什么解决方法吗?您可以在控制器中声明特定类型参数的自定义映射方法:
@InitBinder
public void initBinder(WebDataBinder dataBinder) {
dataBinder.registerCustomEditor(GenderEnum.class,
new PropertyEditorSupport() {
@Override
public void setAsText(String value){
setValue(GenderEnum.getByCode(Integer.parseInt(value));
}
});
}
此URL可能会帮助您如何检索元素?你能出示密码吗?像MALEMALE一样定义enum可以作为解决ithink@ShamilPuthukkot性别:1这是由产品经理决定的设计并不令人信服,但是您应该能够为字段注册自定义序列化程序和反序列化程序:我有同样的问题