前端传入数字,后端用枚举接收统一处理
举例:
有性别枚举:
public enum GenderEnum implements BaseCodeEnum {
male(1,"男"),
female(2,"女");
Integer code ;
String value;
GenderEnum(Integer code , String value){
this.code = code;
this.value = value;
}
@Override
public Integer getCode() {
return code;
}
}
后端接收controller和POJO类:
@PostMapping("/body")
public TestEnumForm test2(@RequestBody TestEnumForm testEnumForm){
return testEnumForm;
}
@Data
public class TestEnumForm {
GenderEnum gender;
}
前端入参:
实际效果如图:
实现方式
@Slf4j
@Component
public class JacksonEnumCustomizer implements Jackson2ObjectMapperBuilderCustomizer {
@Override
public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
jacksonObjectMapperBuilder.serializerByType(BaseCodeEnum.class, new JsonSerializer<BaseCodeEnum>() {
@Override
public void serialize(BaseCodeEnum value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeNumber(value.getCode());
}
});
jacksonObjectMapperBuilder.deserializerByType(Enum.class, new JacksonEnumDeserializer());
}
}
@Slf4j
public class JacksonEnumDeserializer extends JsonDeserializer<Enum> {
@Override
public Enum deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
Object currentValue = jsonParser.getCurrentValue();
Class<?> targetClass = currentValue.getClass();
String value = jsonParser.getText();
String fieldName = jsonParser.getCurrentName();
return getEnum(targetClass, value, fieldName);
}
public Enum getEnum(Class<?> targetClass, String value, String fieldName) {
Class<?> propertyClass = ReflectionUtils.findField(targetClass, fieldName).getType();
Object[] enumConstants = propertyClass.getEnumConstants();
for (Object enumConstant : enumConstants) {
if (ClassUtils.isAssignable(BaseCodeEnum.class, propertyClass)) {
BaseCodeEnum baseCodeEnum = (BaseCodeEnum) enumConstant;
if (baseCodeEnum.getCode().equals(Integer.valueOf(value))) {
return (Enum) enumConstant;
}
} else {
if (((Enum) enumConstant).name().equals(value)) {
return (Enum) enumConstant;
}
}
}
throw new RuntimeException("covert enum error");
}
}
如果上述方式启动后不生效的话,看下面的解决方式:
https://blog.csdn.net/sj1231984/article/details/117673198