解决 Spring HttpMessageConverter 解析多余属性出错问题:DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES

例如,使用注解: @RequestBody Query query 。

MappingJackson2HttpMessageConverter 如何忽略 Query 入参对象未知属性?

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.*;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

/**
 * @author: Jack
 * 2020-08-14 18:53
 */
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = new ObjectMapper();
        /**
         * 序列换成json时,将所有的long变成string, 因为js中得数字类型不能包含所有的java long值.
         * 参考文章: https://blog.csdn.net/universsky2015/article/details/108010953
         */
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
        objectMapper.registerModule(simpleModule);
        // DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        jackson2HttpMessageConverter.setObjectMapper(objectMapper);

        // supportedMediaTypes
        List<MediaType> supportedMediaTypes = new ArrayList<>(jackson2HttpMessageConverter.getSupportedMediaTypes());
        supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        supportedMediaTypes.add(MediaType.TEXT_HTML);
        supportedMediaTypes.add(new MediaType("application", "*+json", StandardCharsets.UTF_8));
        jackson2HttpMessageConverter.setSupportedMediaTypes(supportedMediaTypes);

        converters.add(jackson2HttpMessageConverter);
    }


    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

        // Spring Boot自动配置本身不会自动把/swagger-ui.html这个路径映射到对应的目录META-INF/resources/下面。
        // 这个swagger-ui.html 相关的所有前端静态文件都在springfox-swagger-ui.jar里面。
        registry.addResourceHandler("swagger-ui.html")
            .addResourceLocations("classpath:/META-INF/resources/");

        registry.addResourceHandler("/webjars/**")
            .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 多个拦截器组成一个拦截器链
        // addPathPatterns 用于添加拦截规则
        // excludePathPatterns 用户排除拦截

        //添加拦截器
        registry.addInterceptor(new CheckpreloadInterceptor());

        super.addInterceptors(registry);
    }


}

另外,用Jackson解决就非常容易了,只需要在实体类上加上注解就可以。为@RequestBody 修饰的 Bean 类,加上注解:

@JsonIgnoreProperties(ignoreUnknown = true)

即可!

@JsonIgnoreProperties(ignoreUnknown = true)
class ExtraBean {
    private boolean is_museuser;

    public boolean isIs_museuser() {
        return is_museuser;
    }

    public void setIs_museuser(boolean is_museuser) {
        this.is_museuser = is_museuser;
    }
}

@JsonIgnore注解用来忽略某些字段,可以用在Field或者Getter方法上,用在Setter方法时,和Filed效果一样。这个注解只能用在POJO存在的字段要忽略的情况,不能满足现在需要的情况。

@JsonIgnoreProperties(ignoreUnknown = true),将这个注解写在类上之后,就会忽略类中不存在的字段,可以满足当前的需要。这个注解还可以指定要忽略的字段。使用方法如下:

@JsonIgnoreProperties({ “internalId”, “secretKey” })
指定的字段不会被序列化和反序列化。

你可能感兴趣的:(SpringBoot,Java)