欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringMVC处理参数中的枚举类型通用实现

程序员文章站 2022-05-11 14:21:28
业务场景:前端提交了枚举的一个属性value,想由spring来完成参数类型自动转换成对应的枚举。 比方有一个枚举 实现统一自定义接口 需要自动转换的枚举实现统一自定义接口,可随意定义,此处直接用get方法 实现ConverterFactory 实现某一个class的类型自动转换,实现conve ......

业务场景:前端提交了枚举的一个属性value,想由spring来完成参数类型自动转换成对应的枚举。

比方有一个枚举

@allargsconstructor(access = accesslevel.private)
@getter
@jsonformat(shape = jsonformat.shape.object)
public enum registerstatus implements springconverterableenum {
    waiting(0, "待审核"),

    passed(1, "已通过"),

    rejected(2, "已拒绝");

    private int value;

    private string desc;
}

实现统一自定义接口

需要自动转换的枚举实现统一自定义接口,可随意定义,此处直接用get方法

public interface springconverterableenum {
    int getvalue();
}

实现converterfactory

实现某一个class的类型自动转换,实现converter接口。要实现能支持多种枚举的通用转换,应当实现converterfactory接口。

实现中利用class提供的getenumconstants来获得任意枚举类型的values

public class valuedenumconverter implements converterfactory<string, springconverterableenum> {
    @override
    public <t extends springconverterableenum> converter<string, t> getconverter(class<t> targettype) {
        return new integertoenum(targettype);
    }

    private class integertoenum<t extends springconverterableenum> implements converter<string, t> {

        private final t[] values;

        public integertoenum(class<t> targettype) {
            values = targettype.getenumconstants();
        }

        @override
        public t convert(string source) {
            for (t t : values) {
                if (t.getvalue() == integer.valueof(source)) {
                    return t;
                }
            }
            return null;
        }
    }
}

注册到spring中

 <mvc:annotation-driven conversion-service="conversionservice"/>
 <bean class="org.springframework.context.support.conversionservicefactorybean" id="conversionservice">
        <property name="converters">
            <list>
                <bean class="com... valuedenumconverter"/>
            </list>
        </property>
    </bean>

之后,form或者ajax提交registerstatus=1时,则会自动转换为枚举对象。