SpringMvc获取返回枚举值

一、前端传code值,后端自动转枚举(这里举例code为int类型)只适用表单传参!

spring是通过Converter接口将Inter转换枚举。

分为三个步骤:

  1. 配置实现转换能力接口IntToEnumConverable
  2. 设置自定义类型的转换工厂EnumConverterFac
  3. 将工厂添加到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;
posted @ 2022-02-16 23:29  站在巨人肩上的人  阅读(933)  评论(0)    收藏  举报