springboot2 枚举值反序列化成java对象

2020-03-09  本文已影响0人  土坡飞机

把前端传到后端的值用枚举标识有好处。
比如:可以罗列出来前端会传过来的值有哪些种类,可以方便的并且有效的管理该属性。

1.定义枚举

public enum FruitType {
    APPLE, ORANGE;
}

2. 用在request body中

// Request Body DTO
public class RequestBodyDTO {
    private FruitType type;
    // getter, setter
}

@PostMapping
public String resource(@RequestBody RequestBodyDTO dto) {
    dto.getType() // 这里就是枚举了
}

那么形如这样的json

{
    "type": "APPLE"
}

就可以映射成java对象

3. 用在Request Parmas中

@GetMapping
public String resource(@RequestParams("type") FruitType type) {
    type// 拿到的参数就是枚举了
}

TIPS

但是有些时候前端可能传过来的数据不是那么正则,比如会传过来,apple 或者 Apple, 那么枚举里没有这个枚举值就挂了。所以这时需要忽略大小写。

对于springboot2的方式是:

  1. 在application.yml中配置即可
spring:
    jackson:
        mapper:
            ACCEPT_CASE_INSENSITIVE_ENUMS: true

但是配置这种只能解决通过对象传进来的情况(request body),如上例的post方式。

  1. 让上述get方式的request params方式也生效
@Configuration
public class FormatterConfiguration implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        ApplicationConversionService.configure(registry);
    }
}
  1. 如果传过来的数据不在定义的枚举里会报没有匹配上枚举的错误,则可以配置
@Configuration
public class CustomSerializeJsonConfigurer implements WebMvcConfigurer {

    @Autowired
    private ObjectMapper objectMapper;

    @PostConstruct
    public void customObjectMapper() {
        // 枚举没有匹配上 默认值为false
        objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
    }

    @PostConstruct
    public void myObjectMapper() {
        // 如果没有匹配上,默认为某个枚举,则这时需要在要指定枚举的上面加:
        // @JsonEnumDefaultValue
        objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE, true);
    }

上一篇 下一篇

猜你喜欢

热点阅读