比如一个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里的方法,怎么回事啊?
方法挺多,按需选择
ObjectMapper
,后者单独配置一个自定义的Serializer
jackson
,入库用gson
解析json用的是jackson,用不到spring的Formatter和Converter之类的机制,所以改他们没有效果