zoukankan      html  css  js  c++  java
  • SpringMVC处理参数中的枚举类型通用实现

    业务场景:前端提交了枚举的一个属性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时,则会自动转换为枚举对象。

  • 相关阅读:
    HDU 1000 A + B Problem
    HDU 3635 Dragon Balls
    HDU 3461 Code Lock
    HDU 1856 More is better
    HDU 1198 Farm Irrigation
    HDU 1325 Is It A Tree?
    HDU 1001 Sum Problem
    HDU 1829 A Bug's Life
    HDU 2610 Sequence one
    HDU 3350 #define is unsafe
  • 原文地址:https://www.cnblogs.com/caizhiqin/p/10000649.html
Copyright © 2011-2022 走看看