package org.springboot.sample.config; import java.util.ArrayList; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springboot.sample.config.viewresolver.JsonViewResolver; import org.springboot.sample.config.viewresolver.PdfViewResolver; import org.springboot.sample.config.viewresolver.XlsViewResolver; import org.springboot.sample.interceptor.JsonErrorMsgInterceptor; import org.springboot.sample.interceptor.MyInterceptor1; import org.springboot.sample.interceptor.MyInterceptor2; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.context.EnvironmentAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.validation.beanvalidation.MethodValidationPostProcessor; import org.springframework.web.accept.ContentNegotiationManager; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.view.ContentNegotiatingViewResolver; @Configuration public class MyWebAppConfigurer extends WebMvcConfigurerAdapter implements EnvironmentAware { private static final Logger logger = LoggerFactory.getLogger(MyWebAppConfigurer.class); private RelaxedPropertyResolver propertyResolver; @Value("${spring.datasource.url}") private String myUrl; @Override public void addInterceptors(InterceptorRegistry registry) { // 多个拦截器组成一个拦截器链 // addPathPatterns 用于添加拦截规则 // excludePathPatterns 用户排除拦截 registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/**"); registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**"); // registry.addInterceptor(new JsonErrorMsgInterceptor()).addPathPatterns("*.json"); registry.addInterceptor(new JsonErrorMsgInterceptor()).addPathPatterns("/**"); super.addInterceptors(registry); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 访问myres根目录下的fengjing.jpg 的URL为 http://localhost:8080/myres/fengjing.jpg 不影响Spring Boot的默认的 /** 映射,可以同时使用。 registry.addResourceHandler("/myres/**").addResourceLocations("classpath:/myres/"); // 访问myres根目录下的fengjing.jpg 的URL为 http://localhost:8080/fengjing.jpg (/** 会覆盖系统默认的配置) // registry.addResourceHandler("/**").addResourceLocations("classpath:/myres/").addResourceLocations("classpath:/static/"); // 可以直接使用addResourceLocations 指定磁盘绝对路径,同样可以配置多个位置,注意路径写法需要加上file: registry.addResourceHandler("/myimgs/**").addResourceLocations("file:H:/myimgs/"); super.addResourceHandlers(registry); } /** * 这个方法只是测试实现EnvironmentAware接口,读取环境变量的方法。 */ @Override public void setEnvironment(Environment env) { logger.info(env.getProperty("JAVA_HOME")); logger.info(myUrl); String str = env.getProperty("spring.datasource.url"); logger.info(str); propertyResolver = new RelaxedPropertyResolver(env, "spring.datasource."); String url = propertyResolver.getProperty("url"); logger.info(url); } @Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { for (HttpMessageConverter<?> httpMessageConverter : converters) { // 为 MappingJackson2HttpMessageConverter 添加 "application/javascript" 支持,用于响应JSONP的Content-Type if(httpMessageConverter instanceof MappingJackson2HttpMessageConverter){ MappingJackson2HttpMessageConverter convert = (MappingJackson2HttpMessageConverter)httpMessageConverter; List<MediaType> medisTypeList = new ArrayList<>(convert.getSupportedMediaTypes()); medisTypeList.add(MediaType.valueOf("application/javascript;charset=UTF-8")); convert.setSupportedMediaTypes(medisTypeList); break; } } super.extendMessageConverters(converters); } @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.defaultContentType(MediaType.TEXT_HTML) // .useJaf(true) // .favorPathExtension(true) .mediaType("xml", MediaType.APPLICATION_XML) .mediaType("pdf", MediaType.valueOf("application/pdf")) .mediaType("json", MediaType.APPLICATION_JSON) .mediaType("xls", MediaType.valueOf("application/vnd.ms-excel")) .ignoreAcceptHeader(true); } /* * Configure ContentNegotiatingViewResolver */ @Bean public ViewResolver contentNegotiatingViewResolver(ContentNegotiationManager manager) { ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver(); resolver.setContentNegotiationManager(manager); // Define all possible view resolvers List<ViewResolver> resolvers = new ArrayList<ViewResolver>(); resolvers.add(new JsonViewResolver()); resolvers.add(new PdfViewResolver()); resolvers.add(new XlsViewResolver()); resolver.setViewResolvers(resolvers); return resolver; } @Bean public MethodValidationPostProcessor methodValidationPostProcessor(){ MethodValidationPostProcessor processor = new MethodValidationPostProcessor(); return processor; } }