Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不使用@JsonCreator的情况下,将请求参数中的整数转换为枚举类型的字段的枚举?_Java_Spring_Spring Boot_Spring Mvc_Enums - Fatal编程技术网

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这是由产品经理决定的设计并不令人信服,但是您应该能够为字段注册自定义序列化程序和反序列化程序:我有同样的问题