SpringMvc获取返回枚举值
一、前端传code值,后端自动转枚举(这里举例code为int类型)只适用表单传参!
spring是通过Converter接口将Inter转换枚举。
分为三个步骤:
- 配置实现转换能力接口IntToEnumConverable
- 设置自定义类型的转换工厂EnumConverterFac
- 将工厂添加到Spring容器中
/**config配置 ,将转换工厂添加到容器中
@Configuration
public class MyConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverterFactory(new EnumConverterFac());
}
}
/** 给需要自动转换的枚举值使用,返回的是前端转入的code类型。这里是以int示例,所以这里也是int
public interface IntToEnumConverable extends Serializable {
int getValue();
}
/** 枚举中使用,直接继承上面接口,使用如下:
public enum MyEnum implements IntToEnumConverable {
MAN(1,"男"),WOMAN(2,"女");
MyEnum(int code, String comment) {
this.code = code;
this.comment = comment;
}
public int code;
@JsonValue
public String comment;
@Override
public int getValue() {
return code;
}
}
/** Converter工厂如下
public class EnumConverterFac implements ConverterFactory<String, Enum> {
@Override
public <T extends Enum> Converter<String, T> getConverter(Class<T> aClass) {
return new IntToEnum(aClass);
}
private static class IntToEnum<T extends IntToEnumConverable> implements Converter<String,IntToEnumConverable>{
private final Class<T> enumType;
public IntToEnum(Class<T> enumType) {
this.enumType = enumType;
}
@Override
public IntToEnumConverable convert(String s) {
for (T enumConstant : enumType.getEnumConstants()) {
if (enumConstant instanceof IntToEnumConverable){
if (enumConstant.getValue() == Integer.valueOf(s))
return enumConstant;
}
}
return null;
}
}
}
注意!!!当存在Json传参时
当存在json传参时候,我们只需要在枚举中添加一个反序列化的方法,而且必须是静态的!!!
@JsonCreator
public static MyEnum getEnumInstance(Integer i){
for (MyEnum value : values()) {
if (value.code == i)
return value;
}
return null;
}
二、后端传枚举值,返回code值
SpringMvc Controller层对象的序列化是交给Jackson来完成的,jackson有个专门的注解(@JsonValue)可以完成这个需求。只需要将此注解放到需要返回的字段上就可以了,示例如下:
@JsonValue
public String comment;