1. 程式人生 > >SpringMVC處理引數中的列舉型別通用實現

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時,則會自動轉換為列舉物件。