例如,使用注解: @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” })
指定的字段不会被序列化和反序列化。