springboot mybatisplus 枚举转换
·
作用:实体类直接用枚举类型.从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);
}
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)