如果我们需要对Controller里面的方法的所有参数进行全局拦截(比如做默认值初始化,自定义验证), 则可以从MappingJackson2HttpMessageConverter入手:
/**
* @author rocklee
* @version
* Create date:2019年5月10日 下午11:23:35
*/
@Component
public class MyJson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {
@Autowired
protected ValidateProcessor validateProcessor;
@Override
protected Object readInternal(Class<? extends Object> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException {
return super.readInternal(clazz, inputMessage);
}
@Override
public Object read(Type type, Class<?> contextClass, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException {
Object lvRet=super.read(type, contextClass, inputMessage);
if (lvRet!=null&& lvRet.getClass().isArray()){
Object[] lvItems= (Object[]) lvRet;
for (Object o:lvItems){
validateProcessor.doProcess(o);
}
}
else if (lvRet!=null && lvRet instanceof List){
for (Object o:(List)lvRet){
validateProcessor.doProcess(o);
}
}
else if (lvRet!=null){
validateProcessor.doProcess(lvRet);
}
return lvRet;
}
}
定义好后,在WebMvcConfigurer里面加入:
/**
* Created by rocklee on 2019/8/10 9:01
* Web配置类
*/
@Order(0)
@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
protected MyJson2HttpMessageConverter myJson2HttpMessageConverter;
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
System.out.println("=======================加载自定义处理器configureMessageConverters====================");
converters.add(myJson2HttpMessageConverter);
}
/**
* 添加静态资源文件,外部可以直接访问地址
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//第一个方法设置访问路径前缀,第二个方法设置资源路径
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
}
可能springboot2.x默认将classpath:/static/下的资源映射为url "/",而加了webconfig之后, 必须要手动指出资源的映射关系.