
在controller层接口接收参数的时候,是使用objectMapper进行反序列化的,而里面有个配置:READ_UNKNOWN_ENUM_VALUES_AS_NULL,意思就是:获取到不认识的枚举值赋值为null,不报错;
在springboot中可在yml配置文件中写:
spring:
jackson:
deserialization:
READ_UNKNOWN_ENUM_VALUES_AS_NULL: true
在mybatis查询到结果反序列的时候,可以使用mybatis的类型处理器TypeHandler,来做反序列化时候判断。
在配置文件中指定默认的枚举类型处理器:
mybatis:
configuration:
default-enum-type-handler: com.example.csdn.enum_test.MyEnumTypeHandler
// 自定义枚举处理器,继承mybatis自带的EnumTypeHandler,简化优化需写的代码
// @MappedTypes 的意思是用于指明该TypeHandler实现类能够处理的Java 类型的集合
// @MappedTypes({Enum.class})的意思是:只有是枚举类型的才会走下面的处理器
@MappedTypes({Enum.class})
public class MyEnumTypeHandler<E extends Enum<E>> extends EnumTypeHandler<E> {
// 枚举类型对应的class对象
private final Class<E> type;
public MyEnumTypeHandler(Class<E> type) {
super(type);
this.type = type;
}
@Override
public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
String s = rs.getString(columnName);
// 取到枚举所有值
final Field[] declaredFields = type.getFields();
// 如果从库里面取到的值,存在枚举值中的一个
// 则 直接转枚举,否则,直接负责为null
return Arrays.stream(declaredFields).anyMatch(field -> field.getName().equals(s))
? Enum.valueOf(type, s) : null;
}
}
解释一下: 真正有这种需求的人可以考虑使用上述方法,其他情况下不建议这样子操作,毕竟如果对方传个莫名其妙的东西,你也不知道对方到底传递什么非法内容,直接转null了,而且在controller层dto对象中定义枚举,也是一种校验,直接不符合规则,更早报错。
在配置文件中配置:
spring:
jackson:
deserialization:
READ_UNKNOWN_ENUM_VALUES_AS_NULL: true
代码:
@Data
public class testDto {
private String name;
private test_enum pwd;
}
public enum test_enum {
A, B, C,
}
@RestController
public class EnumController {
@PostMapping("/enum/test")
public void test2(@RequestBody testDto testDto){
System.out.println(testDto);
}
}

在不加自定义类型处理器的情况下:


在加入自定义处理器的情况下:
配置文件中配置:
mybatis:
configuration:
default-enum-type-handler: com.example.csdn.enum_test.MyEnumTypeHandler
@MappedTypes({Enum.class})
public class MyEnumTypeHandler<E extends Enum<E>> extends EnumTypeHandler<E> {
// 枚举类型对应的class对象
private final Class<E> type;
public MyEnumTypeHandler(Class<E> type) {
super(type);
this.type = type;
}
@Override
public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
String s = rs.getString(columnName);
// 取到枚举所有值
final Field[] declaredFields = type.getFields();
// 如果从库里面取到的值,存在枚举值中的一个
// 则 直接转枚举,否则,直接负责为null
return Arrays.stream(declaredFields).anyMatch(field -> field.getName().equals(s))
? Enum.valueOf(type, s) : null;
}
}

