json请求参数枚举转换处理完善

wxpay
LI-CCONG\李聪聪 8 months ago
parent cc1877fd39
commit 4ed85aeb05

@ -35,9 +35,8 @@ public class JsonConfig {
jacksonObjectMapperBuilder.serializerByType(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE); jacksonObjectMapperBuilder.serializerByType(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE);
jacksonObjectMapperBuilder.deserializerByType(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE); jacksonObjectMapperBuilder.deserializerByType(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE);
// String <-> Enum // String <-> Enum
// jacksonObjectMapperBuilder.serializerByType(Enum.class, EnumSerializer.INSTANCE); jacksonObjectMapperBuilder.serializerByType(Enum.class, EnumSerializer.INSTANCE);
// jacksonObjectMapperBuilder.deserializerByType(Enum.class, EnumDeserializer.INSTANCE); jacksonObjectMapperBuilder.deserializerByType(Enum.class, EnumDeserializer.INSTANCE);
}; };
} }
} }

@ -2,7 +2,6 @@ package cc.yunxi.common.domain.convert;
import cc.yunxi.common.enums.BaseEnum; import cc.yunxi.common.enums.BaseEnum;
import cc.yunxi.common.factory.StringCodeToEnumConverterFactory; import cc.yunxi.common.factory.StringCodeToEnumConverterFactory;
import com.baomidou.mybatisplus.annotation.IEnum;
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.BeanProperty; import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.DeserializationContext;
@ -21,7 +20,7 @@ import java.io.IOException;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class EnumDeserializer extends JsonDeserializer<BaseEnum> implements ContextualDeserializer { public class EnumDeserializer extends JsonDeserializer<BaseEnum> implements ContextualDeserializer {
private Class<?> target; private Class<? extends BaseEnum> target;
public static final EnumDeserializer INSTANCE = new EnumDeserializer(); public static final EnumDeserializer INSTANCE = new EnumDeserializer();
@ -32,10 +31,11 @@ public class EnumDeserializer extends JsonDeserializer<BaseEnum> implements Cont
return null; return null;
} }
// BaseEnum类 = target类相同 | tartget类的父类或接口 // BaseEnum类 = target类相同 | tartget类的父类或接口
if (BaseEnum.class.isAssignableFrom(target)) { // if (BaseEnum.class.isAssignableFrom(target)) {
return StringCodeToEnumConverterFactory.getEnum((Class) target, jsonParser.getText()); // return StringCodeToEnumConverterFactory.getEnum(target, jsonParser.getText());
} // }
return defaultEnumTransform(target,jsonParser.getText()); // return defaultEnumTransform(target,jsonParser.getText());
return StringCodeToEnumConverterFactory.getEnum(target, jsonParser.getText());
} }
/** /**
@ -48,11 +48,17 @@ public class EnumDeserializer extends JsonDeserializer<BaseEnum> implements Cont
public JsonDeserializer<?> createContextual(DeserializationContext ctx, BeanProperty property) throws JsonMappingException { public JsonDeserializer<?> createContextual(DeserializationContext ctx, BeanProperty property) throws JsonMappingException {
Class<?> rawCls = ctx.getContextualType().getRawClass(); Class<?> rawCls = ctx.getContextualType().getRawClass();
EnumDeserializer enumDeserializer = new EnumDeserializer(); EnumDeserializer enumDeserializer = new EnumDeserializer();
enumDeserializer.setTarget(rawCls); enumDeserializer.setTarget((Class<? extends BaseEnum>) rawCls);
return enumDeserializer; return enumDeserializer;
} }
/**
* ordinal
* @param type
* @param indexString
* @return BaseEnum
*/
public static BaseEnum defaultEnumTransform(Class<?> type, String indexString) { public static BaseEnum defaultEnumTransform(Class<?> type, String indexString) {
BaseEnum[] enumConstants = (BaseEnum[]) type.getEnumConstants(); BaseEnum[] enumConstants = (BaseEnum[]) type.getEnumConstants();
try { try {

@ -24,16 +24,18 @@ public class EnumSerializer extends JsonSerializer<BaseEnum> {
@Override @Override
public void serialize(BaseEnum baseEnum, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { public void serialize(BaseEnum baseEnum, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
// java 如何获取枚举类的成员属性? 此处有问题, todo
jsonGenerator.writeStartObject(); jsonGenerator.writeStartObject();
Field[] fields = baseEnum.getClass().getFields(); // java 如何获取枚举类的成员属性? 此处有问题, todo
for (Field field : fields) { // Field[] fields = baseEnum.getClass().getFields();
try { // for (Field field : fields) {
jsonGenerator.writeStringField(field.getName(), String.valueOf(field.get(baseEnum))); // try {
} catch (IllegalAccessException e) { // jsonGenerator.writeStringField(field.getName(), String.valueOf(field.get(baseEnum)));
throw new RuntimeException(e); // } catch (IllegalAccessException e) {
} // throw new RuntimeException(e);
} // }
// }
jsonGenerator.writeStringField("code", baseEnum.getCode());
jsonGenerator.writeStringField("desc", baseEnum.getDesc());
jsonGenerator.writeEndObject(); jsonGenerator.writeEndObject();
} }
} }

@ -8,4 +8,9 @@ public interface BaseEnum {
* *
*/ */
String getCode(); String getCode();
/**
*
*/
String getDesc();
} }

@ -1,6 +1,7 @@
package cc.yunxi.common.factory; package cc.yunxi.common.factory;
import cc.yunxi.common.enums.BaseEnum; import cc.yunxi.common.enums.BaseEnum;
import cc.yunxi.common.exception.BadRequestException;
import com.baomidou.mybatisplus.annotation.IEnum; import com.baomidou.mybatisplus.annotation.IEnum;
import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory; import org.springframework.core.convert.converter.ConverterFactory;
@ -38,8 +39,8 @@ public class StringCodeToEnumConverterFactory implements ConverterFactory<String
* @return T * @return T
*/ */
public static <T extends BaseEnum> T getEnum(Class<T> targetType, String source) { public static <T extends BaseEnum> T getEnum(Class<T> targetType, String source) {
StringToEnumConverter enumConverter = new StringToEnumConverter(targetType); StringToEnumConverter<T> enumConverter = new StringToEnumConverter<>(targetType);
return (T) enumConverter.convert(source); return enumConverter.convert(source);
} }
/** /**
@ -50,20 +51,25 @@ public class StringCodeToEnumConverterFactory implements ConverterFactory<String
private final Map<String, T> enumMap = new HashMap<>(); private final Map<String, T> enumMap = new HashMap<>();
private final Map<String, T> enumCodeMap = new HashMap<>();
public StringToEnumConverter(Class<T> enumType) { public StringToEnumConverter(Class<T> enumType) {
T[] enums = enumType.getEnumConstants(); T[] enums = enumType.getEnumConstants();
for (T e : enums) { for (T en : enums) {
enumMap.put(e.getCode().toString(), e); enumMap.put(en.toString(), en);
enumCodeMap.put(en.getCode().toString(), en);
} }
} }
@Override @Override
public T convert(String source) { public T convert(String source) {
T t = enumMap.get(source); T t = enumMap.get(source);
// Enum.valueOf(enumType, source); todo
if (Objects.isNull(t)) { if (Objects.isNull(t)) {
throw new IllegalArgumentException("无法匹配对应的枚举类型"); t = enumCodeMap.get(source);
if (Objects.isNull(t)) {
throw new BadRequestException("无法匹配对应的枚举类型: " + source);
}
} }
return t; return t;
} }

@ -4,6 +4,7 @@ import cc.yunxi.common.domain.CommonResult;
import cc.yunxi.common.exception.BadRequestException; import cc.yunxi.common.exception.BadRequestException;
import cc.yunxi.domain.query.TestQuery; import cc.yunxi.domain.query.TestQuery;
import cc.yunxi.enums.UserTypeEnum; import cc.yunxi.enums.UserTypeEnum;
import cn.hutool.log.Log;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -43,7 +44,7 @@ public class TestController {
@ApiOperation("测试枚举转换") @ApiOperation("测试枚举转换")
@PostMapping("/test04") @PostMapping("/test04")
public CommonResult<TestQuery> enumConvert(@RequestBody TestQuery testQuery) { public CommonResult<TestQuery> enumConvert(@RequestBody TestQuery testQuery) {
log.info("testQuery = {}", testQuery.toString());
return CommonResult.success(testQuery); return CommonResult.success(testQuery);
} }

@ -11,7 +11,9 @@ import lombok.Getter;
@AllArgsConstructor @AllArgsConstructor
public enum BusinessCodeEnum implements BaseEnum { public enum BusinessCodeEnum implements BaseEnum {
ORDER("RO"); ORDER("RO", "订单业务码");
private final String code; private final String code;
private final String desc;
} }

Loading…
Cancel
Save