Spring Boot 使用枚举类型作为api请求参数,如何接收int

比如一个enum

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;
}

有一个controller接收

@RestController
class MyController{
  @PostMapping('/alink')
  ResponseBean doSomething(@RequestBody Param param){
      ...
  }
}

传入参数

{"id":"L323", "gender":1}

想要获得MALE

有一个方法是getByCode(int code)上加@JsonCreator。但是目前的DAO层enum入库还是value字符串,也就是MALE或者FEMALE,用这个会导致之前库里其他enum数据取出来报错。所以希望只是在MVC层做变化。找到这个方案 https://xkcoding.com/2019/01/...

大致就是用

    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {

        /**
         * 枚举类的转换器工厂 addConverterFactory
         */
        @Override
        public void addFormatters(FormatterRegistry registry) {
            registry.addConverterFactory(new IntegerCodeToEnumConverterFactory());  
            registry.addConverterFactory(new StringCodeToEnumConverterFactory());
        }
    }
    

但是不起作用,调试发现调用api接口的时候,只会走jackson的json序列化方法(如果传入integer,就会根据ordinal映射成enum,而不是code),不会走这个converter里的方法,怎么回事啊?

阅读 12.1k
2 个回答

方法挺多,按需选择

  1. 入库 和 springmvc 使用不同的 ObjectMapper,后者单独配置一个自定义的Serializer
  2. 入库 和 springmvc 使用不同的 json 库…比如默认 springmvc 用 jackson,入库用 gson

解析json用的是jackson,用不到spring的Formatter和Converter之类的机制,所以改他们没有效果

应该是要自定义converter了,看其他答主的或网上搜。

我比较好奇的是,为什么不让前端传 MALE 和 FEMALE ?

springmvc 应该是提供了 StringToEnumConverter 默认支持枚举的。

传入参数

{"id":"L323", "gender":"MALE"}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题