SpringBoot设置全局的枚举转换器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/iuie_sl/article/details/82421557

应用场景:

将string转化为后端的枚举。

大致思路:

编写一个转换器工厂类。获取传入的目标对象,在工厂类中调用转换器,进行转换,向spring容器中注入工厂类。

枚举的接口

public interface BaseEnum {
    /**
     * Gets value.
     *
     * @return the value
     */
    String getValue();
}

枚举的实现

public enum OrderStatusEnum implements BaseEnum{
    /**
     * All order status enum.
     */
    ALL("ALL"),
    /**
     * Saved order status enum.
     */
    SAVED("Saved"),
    /**
     * Queued order status enum.
     */
    QUEUED("Queued"),
    /**
     * Requeued order status enum.
     */
    REQUEUED("Requeued"),
    /**
     * Released order status enum.
     */
    RELEASED("Released"),
    /**
     * Finished order status enum.
     */
    FINISHED("Finished");
    private String value;
    OrderStatusEnum(String value){
        this.value = value;
    }
    @Override
    public String toString() {
        return String.valueOf(value);
    }
    /**
     * From value order status enum.
     *
     * @param text the text
     * @return the order status enum
     */
    public OrderStatusEnum fromValue(String text) {
        for (OrderStatusEnum b : OrderStatusEnum.values()) {
            if (String.valueOf(b.value).equals(text)) {
                return b;
            }
        }
        return null;
    }
    /**
     * Gets the values list.
     *
     * @return valueList List
     */
    public static List<String> getValuesList() {
        List<String> valueList = new ArrayList<String>();
        for (OrderStatusEnum b : OrderStatusEnum.values()) {
            valueList.add(b.toString());
        }
        return valueList;
    }
    @Override
    public String getValue() {
        return value;
    }
}

枚举转换的工厂类

@Component
public class EnumConvertFactory implements ConverterFactory<String,BaseEnum> {
    @Override
    public <T extends BaseEnum> Converter<String, T> getConverter(Class<T> targetType) {
        return new StringToIEum<>(targetType);
    }
    private static class StringToIEum<T extends BaseEnum>  implements Converter<String, T> {
        private  Class<T> targerType;
        /**
         * Instantiates a new String to i eum.
         *
         * @param targerType the targer type
         */
        public StringToIEum(Class<T> targerType) {
            this.targerType = targerType;
        }
        @Override
        public T convert(String source) {
            if (StringUtils.isBlank(source)) {
                return null;
            }
            return (T) EnumUtil.getIEnum(this.targerType,source);
        }
    }
}

注入枚举工厂类

@Configuration
public class WebContextConfiguration {
    @Autowired
    private RequestMappingHandlerAdapter requestMappingHandlerAdapter;
    /**
     * Get web context web context.
     *
     * @param request the request
     * @return the web context
     */
    @Bean
    @Scope(scopeName = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
    public WebContext getWebContext(@Autowired HttpServletRequest request) {
        return new WebContext(request);
    }
    /**
     * Add conversion config.
     */
    @PostConstruct
    public void addConversionConfig() {
        ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) requestMappingHandlerAdapter.getWebBindingInitializer();
        if (initializer != null && initializer.getConversionService() != null) {
            GenericConversionService genericConversionService = (GenericConversionService)initializer.getConversionService();
            if(genericConversionService != null){
                genericConversionService.addConverterFactory(new EnumConvertFactory());
            }
        }
    }
}

工具类

public class EnumUtil {

    /**
     * Gets i enum.
     *
     * @param <T>        the type parameter
     * @param targerType the targer type
     * @param source     the source
     * @return the i enum
     */
    public static <T extends BaseEnum> Object getIEnum(Class<T> targerType, String source) {
        for(T enumObj : targerType.getEnumConstants()){
            if(source .equals( enumObj.getValue())){
                return enumObj;
            }
        }
        return null;
    }
}

猜你喜欢

转载自blog.csdn.net/iuie_sl/article/details/82421557