zoukankan      html  css  js  c++  java
  • 增加一个spring mvc 的枚举转换器

    用jaskson 的 注解 @JsonCreator 失效了,但是没排查出来具体原因,把我气坏了,于是写了一个转换器 先来解决项目问题。
    因为我已经用接口约束了,关键值 为code 所以写死代码。
    代码如下:

    public class StringToEnumConverterFactory implements ConverterFactory<String, Enum> {
        @Override
        public <T extends Enum> Converter<String, T> getConverter(Class<T> targetType) {
            return new StringToEnum(getEnumType(targetType));
        }
    
        public static Class<?> getEnumType(Class<?> targetType) {
            Class<?> enumType = targetType;
            while (enumType != null && !enumType.isEnum()) {
                enumType = enumType.getSuperclass();
            }
            Assert.notNull(enumType, () -> "不是有效的枚举");
            return enumType;
        }
    
        private static class StringToEnum<T extends Enum> implements Converter<String, T> {
    
            private final Class<T> enumType;
    
            public StringToEnum(Class<T> enumType) {
                this.enumType = enumType;
            }
    
            @Override
            public T convert(String source) {
                if (source.isEmpty()) {
                    return null;
                }
                source = source.trim();
                try {
    
                    if (Arrays.stream(this.enumType.getDeclaredFields()).anyMatch(am -> {
                                String sinew = StringUtils.trimWhitespace(am.toString());
                                return sinew.length() > 5 && ".code".equals(sinew.substring(sinew.length() - 5));
                            }
    
                    )) {
                        Method getCodeMethod = this.enumType.getDeclaredMethod("getCode");
                        for (Object obj : this.enumType.getEnumConstants()) {
                            if (source.equals(getCodeMethod.invoke(obj).toString())) {
                                return enumType.cast(obj);
                            }
                        }
                    }
                } catch (Exception e) {
                    return (T) Enum.valueOf(this.enumType, source);
                }
            }
        }
    }
    
    
  • 相关阅读:
    九度OJ 1010 A+B
    九度OJ 1052 找x
    oracle数据库创建备份与恢复 脚本
    在select标签中添加a标签
    如何在select标签中使用a标签跳转页面
    网站访问不了
    js实现input的赋值
    PHP如何实现百万级数据导出
    互联网产品需求管理杂思2需求收集,互联网营销 狼人:
    做网站用UTF8还是GB2312?,互联网营销 狼人:
  • 原文地址:https://www.cnblogs.com/akashicbrother/p/14567391.html
Copyright © 2011-2022 走看看