美文网首页
springboot2 枚举值反序列化成java对象

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

作者: 土坡飞机 | 来源:发表于2020-03-09 14:43 被阅读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);
        }
    
    

    相关文章

      网友评论

          本文标题:springboot2 枚举值反序列化成java对象

          本文链接:https://www.haomeiwen.com/subject/vqlpdhtx.html