作用:实体类直接用枚举类型.从spring到mybatis,所以类型全用枚举实现

/**
* 基本枚举的接口
*/
public interface BaseEnum {

    /**
     * 获取枚举值
     *
     * @return
     */
    Integer getValue();

    /**
     * 获取枚举文本
     *
     * @return
     */
    String getLabel();

    /**根据枚举值和type获取枚举*/
    public static <T extends BaseEnum> T getEnum(Class<T> type, int value) {
        T[] objs = type.getEnumConstants();
        for (T em : objs) {
            if (em.getValue().equals(value)) {
                return em;
            }
        }
        return null;
    }
}
/**
*具体实现枚举
*/
public enum StatusEnum implements BaseEnum {
        /**
         * 待处理
         */
        PENDING(1, "待处理"),
        /**
         * 进行中
         */
        DOING(2, "进行中"),
        /**
         * 已完成
         */
        COMPLETED(3, "已完成");

        private final Integer value;
        private final String label;

        StatusEnum(Integer value, String label) {
            this.value = value;
            this.label = label;
        }

        @Override
        public Integer getValue() {
            return value;
        }

        @Override
        public String getLabel() {
            return label;
        }
    }

一:mybatis到实体类的枚举转换

application.yml加入typeHandlersPackage的配置

#yml配置BaseTypeHandler扫描包的位置
mybatisPlus:
  typeHandlersPackage: com.mybatis.handler

mybatis枚举处理器

/**mybatis 把value转换成具体枚举的处理器*/
@MappedTypes(value = BaseEnum.class)
public class EnumTypeHandler<T extends BaseEnum> extends BaseTypeHandler<BaseEnum> {
    private Class<T> type;

    public EnumTypeHandler(Class<T> type) {
        this.type = type;
    }

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, BaseEnum parameter, JdbcType jdbcType) throws SQLException {
        ps.setInt(i, parameter.getValue());
    }

    @Override
    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return convert(rs.getInt(columnName));
    }

    @Override
    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return convert(rs.getInt(columnIndex));
    }

    @Override
    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return convert(cs.getInt(columnIndex));
    }

    private T convert(int value) {
        return BaseEnum.getEnum(type, value);
    }
}

mybatis的mapper.xml可以下面代码获取枚举值

${@com.enums.User$StatueEnum@DOING.value}

二:springboot相关

json序列化 

/**
 * BaseEnum序列化
 *
 */
public class BaseEnumSerializer extends JsonSerializer<BaseEnum> {
    @Override
    public void serialize(BaseEnum value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeNumber(value.getValue());
        gen.writeStringField(gen.getOutputContext().getCurrentName() + "Text", value.getLabel());
    }
}

json反序列化

/**
 * BaseEnum反序列化
 *
 */
public class BaseEnumDeserializer extends JsonDeserializer<Enum> {

    @Override
    public Enum deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        JsonNode node = p.getCodec().readTree(p);
        String currentName = p.currentName();
        Object currentValue = p.getCurrentValue();
        Class findPropertyType = null;
        findPropertyType = BeanUtils.findPropertyType(currentName, currentValue.getClass());
        if (findPropertyType == null) {
            throw new CustomException("在" + currentValue.getClass() + "实体类中找不到" + currentName + "字段");
        }
        String asText = null;
        asText = node.asText();
        if (StringUtils.isBlankOrZero(asText)) {
            return null;
        }

        if (BaseEnum.class.isAssignableFrom(findPropertyType)) {
            BaseEnum valueOf = null;
            if (StringUtils.isNotBlank(asText)) {
                valueOf = BaseEnum.getEnum(findPropertyType, Integer.parseInt(asText));
            }
            if (valueOf != null) {
                return (Enum) valueOf;
            }

        }

        return Enum.valueOf(findPropertyType, asText);
    }
}

表单枚举类型转换器

/**
 * 表单BaseEnum枚举转换
 *
 */
public class BaseEnumConverterFactory implements ConverterFactory<String, BaseEnum> {

    @Override
    public <T extends BaseEnum> Converter<String, T> getConverter(Class<T> targetType) {
        return new BaseEnumConverter(targetType);
    }

    public class BaseEnumConverter<String, T extends BaseEnum> implements Converter<String, BaseEnum> {

        private Class<T> type;

        public BaseEnumConverter(Class<T> type) {
            this.type = type;
        }

        @Override
        public BaseEnum convert(String source) {
            return BaseEnum.getEnum(type, Integer.parseInt((java.lang.String) source));
        }
    }
}

注册表单枚举类型转换器

@Configuration
public class WebMvcConfigImpl implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverterFactory(new BaseEnumConverterFactory());
    }
}

配置枚举类型序列化和反序列化

@Configuration
public class BeanConfig {
@Bean
    public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() {
        BaseEnumSerializer baseEnumSerializer = new BaseEnumSerializer();
        BaseEnumDeserializer baseEnumDeserializer = new BaseEnumDeserializer();
        return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault()).
                serializerByType(BaseEnum.class, baseEnumSerializer).
                deserializerByType(Enum.class, baseEnumDeserializer);
    }
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐