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.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);
};
}
}

@ -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<BaseEnum> implements ContextualDeserializer {
private Class<?> target;
private Class<? extends BaseEnum> target;
public static final EnumDeserializer INSTANCE = new EnumDeserializer();
@ -32,10 +31,11 @@ public class EnumDeserializer extends JsonDeserializer<BaseEnum> 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<BaseEnum> 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<? extends BaseEnum>) rawCls);
return enumDeserializer;
}
/**
* ordinal
* @param type
* @param indexString
* @return BaseEnum
*/
public static BaseEnum defaultEnumTransform(Class<?> type, String indexString) {
BaseEnum[] enumConstants = (BaseEnum[]) type.getEnumConstants();
try {

@ -24,16 +24,18 @@ public class EnumSerializer extends JsonSerializer<BaseEnum> {
@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();
}
}

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

@ -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<String
* @return T
*/
public static <T extends BaseEnum> T getEnum(Class<T> targetType, String source) {
StringToEnumConverter enumConverter = new StringToEnumConverter(targetType);
return (T) enumConverter.convert(source);
StringToEnumConverter<T> enumConverter = new StringToEnumConverter<>(targetType);
return enumConverter.convert(source);
}
/**
@ -48,22 +49,27 @@ public class StringCodeToEnumConverterFactory implements ConverterFactory<String
*/
public static class StringToEnumConverter<T extends BaseEnum> implements Converter<String, T> {
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) {
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;
}

@ -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<TestQuery> enumConvert(@RequestBody TestQuery testQuery) {
log.info("testQuery = {}", testQuery.toString());
return CommonResult.success(testQuery);
}

@ -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;
}

Loading…
Cancel
Save