package org.ccframe.app; import java.io.File; import java.nio.charset.Charset; import java.util.List; import org.ccframe.commons.mvc.CcUserArgumentResolver; import org.ccframe.config.GlobalEx; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.log4j.Log4j; import lombok.extern.slf4j.Slf4j; @Configuration @Slf4j public class WebMvcConfigurer extends WebMvcConfigurationSupport { private static final String FILE_PERFIX = "file:"; @Value("${app.debug.swagger}") private boolean swagger; /** * adminUser, apiUser的自动注入参数 */ @Override protected void addArgumentResolvers(List argumentResolvers) { argumentResolvers.add(new CcUserArgumentResolver()); super.addArgumentResolvers(argumentResolvers); } @Override public void configureMessageConverters(List> converters) { converters.add(new StringHttpMessageConverter(Charset.forName("UTF-8"))); // 这里必须加上加载默认转换器,不然bug玩死人,并且该bug目前在网络上似乎没有解决方案 // 百度,谷歌,各大论坛等。你可以试试去掉。 addDefaultHttpMessageConverters(converters); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { //registry.addResourceHandler("/**").addResourceLocations("classpath:/static/"); innerAddResourceHandlers(registry, GlobalEx.COMMON_STATICS_DIR); innerAddResourceHandlers(registry, GlobalEx.UPLOAD_DIR); innerAddResourceHandlers(registry, GlobalEx.SMALL_PICT_DIR); innerAddResourceHandlers(registry, GlobalEx.STATICS_DIR); innerAddResourceHandlers(registry, GlobalEx.TEMP_DIR); innerAddResourceHandlers(registry, GlobalEx.MANAGE_DIR); registry.addResourceHandler("/*.txt","/*.ico","/*.html").addResourceLocations(FILE_PERFIX + GlobalEx.APP_BASE_DIR + File.separator); registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); //knife4j的地址 if(swagger) { log.info("Inited Api document at URI /doc.html"); } registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); } /** * 配置返回映射,null值字段不返回 * @return */ @Bean @Primary public MappingJackson2HttpMessageConverter customJackson2HttpMessageConverter(){ MappingJackson2HttpMessageConverter convertor= new MappingJackson2HttpMessageConverter(); ObjectMapper mapper = new ObjectMapper(); mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); mapper.setSerializationInclusion(Include.NON_NULL); convertor.setObjectMapper(mapper); return convertor; } private void innerAddResourceHandlers(ResourceHandlerRegistry registry, String dirName) { registry.addResourceHandler("/" + dirName + "/**").addResourceLocations(FILE_PERFIX + GlobalEx.APP_BASE_DIR + File.separator + dirName + File.separator); } @Value("${app.debug.cors:false}") private boolean cors; @Override protected void addCorsMappings(CorsRegistry registry) { if(cors) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("GET", "HEAD", "POST","PUT", "DELETE", "OPTIONS") .allowedHeaders("*") .exposedHeaders("access-control-allow-headers", "access-control-allow-methods", "access-control-allow-origin", "access-control-max-age", "X-Frame-Options") .allowCredentials(false).maxAge(3600); } super.addCorsMappings(registry); } }