diff --git a/nxhs-common/src/main/java/cc/yunxi/common/config/JsonConfig.java b/nxhs-common/src/main/java/cc/yunxi/common/config/JsonConfig.java index 4655261..b61a7f1 100644 --- a/nxhs-common/src/main/java/cc/yunxi/common/config/JsonConfig.java +++ b/nxhs-common/src/main/java/cc/yunxi/common/config/JsonConfig.java @@ -35,9 +35,8 @@ public class JsonConfig { jacksonObjectMapperBuilder.serializerByType(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE); jacksonObjectMapperBuilder.deserializerByType(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE); // String <-> Enum -// jacksonObjectMapperBuilder.serializerByType(Enum.class, EnumSerializer.INSTANCE); -// jacksonObjectMapperBuilder.deserializerByType(Enum.class, EnumDeserializer.INSTANCE); - + jacksonObjectMapperBuilder.serializerByType(Enum.class, EnumSerializer.INSTANCE); + jacksonObjectMapperBuilder.deserializerByType(Enum.class, EnumDeserializer.INSTANCE); }; } } \ No newline at end of file diff --git a/nxhs-common/src/main/java/cc/yunxi/common/domain/convert/EnumDeserializer.java b/nxhs-common/src/main/java/cc/yunxi/common/domain/convert/EnumDeserializer.java index 7742b7e..0dce080 100644 --- a/nxhs-common/src/main/java/cc/yunxi/common/domain/convert/EnumDeserializer.java +++ b/nxhs-common/src/main/java/cc/yunxi/common/domain/convert/EnumDeserializer.java @@ -2,7 +2,6 @@ package cc.yunxi.common.domain.convert; import cc.yunxi.common.enums.BaseEnum; import cc.yunxi.common.factory.StringCodeToEnumConverterFactory; -import com.baomidou.mybatisplus.annotation.IEnum; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.BeanProperty; import com.fasterxml.jackson.databind.DeserializationContext; @@ -21,7 +20,7 @@ import java.io.IOException; @EqualsAndHashCode(callSuper = true) public class EnumDeserializer extends JsonDeserializer implements ContextualDeserializer { - private Class target; + private Class target; public static final EnumDeserializer INSTANCE = new EnumDeserializer(); @@ -32,10 +31,11 @@ public class EnumDeserializer extends JsonDeserializer implements Cont return null; } // BaseEnum类 = target类相同 | tartget类的父类或接口 - if (BaseEnum.class.isAssignableFrom(target)) { - return StringCodeToEnumConverterFactory.getEnum((Class) target, jsonParser.getText()); - } - return defaultEnumTransform(target,jsonParser.getText()); +// if (BaseEnum.class.isAssignableFrom(target)) { +// return StringCodeToEnumConverterFactory.getEnum(target, jsonParser.getText()); +// } +// return defaultEnumTransform(target,jsonParser.getText()); + return StringCodeToEnumConverterFactory.getEnum(target, jsonParser.getText()); } /** @@ -48,11 +48,17 @@ public class EnumDeserializer extends JsonDeserializer implements Cont public JsonDeserializer createContextual(DeserializationContext ctx, BeanProperty property) throws JsonMappingException { Class rawCls = ctx.getContextualType().getRawClass(); EnumDeserializer enumDeserializer = new EnumDeserializer(); - enumDeserializer.setTarget(rawCls); + enumDeserializer.setTarget((Class) rawCls); return enumDeserializer; } + /** + * 默认通过ordinal获取 + * @param type + * @param indexString + * @return BaseEnum + */ public static BaseEnum defaultEnumTransform(Class type, String indexString) { BaseEnum[] enumConstants = (BaseEnum[]) type.getEnumConstants(); try { diff --git a/nxhs-common/src/main/java/cc/yunxi/common/domain/convert/EnumSerializer.java b/nxhs-common/src/main/java/cc/yunxi/common/domain/convert/EnumSerializer.java index 78540a7..231ea36 100644 --- a/nxhs-common/src/main/java/cc/yunxi/common/domain/convert/EnumSerializer.java +++ b/nxhs-common/src/main/java/cc/yunxi/common/domain/convert/EnumSerializer.java @@ -24,16 +24,18 @@ public class EnumSerializer extends JsonSerializer { @Override public void serialize(BaseEnum baseEnum, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { - // java 如何获取枚举类的成员属性? 此处有问题, todo jsonGenerator.writeStartObject(); - Field[] fields = baseEnum.getClass().getFields(); - for (Field field : fields) { - try { - jsonGenerator.writeStringField(field.getName(), String.valueOf(field.get(baseEnum))); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } - } + // java 如何获取枚举类的成员属性? 此处有问题, todo +// Field[] fields = baseEnum.getClass().getFields(); +// for (Field field : fields) { +// try { +// jsonGenerator.writeStringField(field.getName(), String.valueOf(field.get(baseEnum))); +// } catch (IllegalAccessException e) { +// throw new RuntimeException(e); +// } +// } + jsonGenerator.writeStringField("code", baseEnum.getCode()); + jsonGenerator.writeStringField("desc", baseEnum.getDesc()); jsonGenerator.writeEndObject(); } } diff --git a/nxhs-common/src/main/java/cc/yunxi/common/enums/BaseEnum.java b/nxhs-common/src/main/java/cc/yunxi/common/enums/BaseEnum.java index b14bf21..10a38da 100644 --- a/nxhs-common/src/main/java/cc/yunxi/common/enums/BaseEnum.java +++ b/nxhs-common/src/main/java/cc/yunxi/common/enums/BaseEnum.java @@ -8,4 +8,9 @@ public interface BaseEnum { * 获取枚举编码 */ String getCode(); + + /** + * 获取枚举描述 + */ + String getDesc(); } diff --git a/nxhs-common/src/main/java/cc/yunxi/common/factory/StringCodeToEnumConverterFactory.java b/nxhs-common/src/main/java/cc/yunxi/common/factory/StringCodeToEnumConverterFactory.java index fe69044..1af6bb3 100644 --- a/nxhs-common/src/main/java/cc/yunxi/common/factory/StringCodeToEnumConverterFactory.java +++ b/nxhs-common/src/main/java/cc/yunxi/common/factory/StringCodeToEnumConverterFactory.java @@ -1,6 +1,7 @@ package cc.yunxi.common.factory; import cc.yunxi.common.enums.BaseEnum; +import cc.yunxi.common.exception.BadRequestException; import com.baomidou.mybatisplus.annotation.IEnum; import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.converter.ConverterFactory; @@ -38,8 +39,8 @@ public class StringCodeToEnumConverterFactory implements ConverterFactory T getEnum(Class targetType, String source) { - StringToEnumConverter enumConverter = new StringToEnumConverter(targetType); - return (T) enumConverter.convert(source); + StringToEnumConverter enumConverter = new StringToEnumConverter<>(targetType); + return enumConverter.convert(source); } /** @@ -48,22 +49,27 @@ public class StringCodeToEnumConverterFactory implements ConverterFactory implements Converter { - private final Map enumMap = new HashMap<>(); + private final Map enumMap = new HashMap<>(); + + private final Map enumCodeMap = new HashMap<>(); public StringToEnumConverter(Class enumType) { T[] enums = enumType.getEnumConstants(); - for (T e : enums) { - enumMap.put(e.getCode().toString(), e); + for (T en : enums) { + enumMap.put(en.toString(), en); + enumCodeMap.put(en.getCode().toString(), en); } } @Override public T convert(String source) { T t = enumMap.get(source); -// Enum.valueOf(enumType, source); todo if (Objects.isNull(t)) { - throw new IllegalArgumentException("无法匹配对应的枚举类型"); + t = enumCodeMap.get(source); + if (Objects.isNull(t)) { + throw new BadRequestException("无法匹配对应的枚举类型: " + source); + } } return t; } diff --git a/nxhs-service/src/main/java/cc/yunxi/controller/TestController.java b/nxhs-service/src/main/java/cc/yunxi/controller/TestController.java index ca46b5b..db1e077 100644 --- a/nxhs-service/src/main/java/cc/yunxi/controller/TestController.java +++ b/nxhs-service/src/main/java/cc/yunxi/controller/TestController.java @@ -4,6 +4,7 @@ import cc.yunxi.common.domain.CommonResult; import cc.yunxi.common.exception.BadRequestException; import cc.yunxi.domain.query.TestQuery; import cc.yunxi.enums.UserTypeEnum; +import cn.hutool.log.Log; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -43,7 +44,7 @@ public class TestController { @ApiOperation("测试枚举转换") @PostMapping("/test04") public CommonResult enumConvert(@RequestBody TestQuery testQuery) { - + log.info("testQuery = {}", testQuery.toString()); return CommonResult.success(testQuery); } diff --git a/nxhs-service/src/main/java/cc/yunxi/enums/BusinessCodeEnum.java b/nxhs-service/src/main/java/cc/yunxi/enums/BusinessCodeEnum.java index baaaa8b..c100143 100644 --- a/nxhs-service/src/main/java/cc/yunxi/enums/BusinessCodeEnum.java +++ b/nxhs-service/src/main/java/cc/yunxi/enums/BusinessCodeEnum.java @@ -11,7 +11,9 @@ import lombok.Getter; @AllArgsConstructor public enum BusinessCodeEnum implements BaseEnum { - ORDER("RO"); + ORDER("RO", "订单业务码"); private final String code; + + private final String desc; }