WebMvcConfigurer.java 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package org.ccframe.app;
  2. import java.io.File;
  3. import java.nio.charset.Charset;
  4. import java.util.List;
  5. import org.ccframe.commons.mvc.CcUserArgumentResolver;
  6. import org.ccframe.config.GlobalEx;
  7. import org.springframework.beans.factory.annotation.Value;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10. import org.springframework.context.annotation.Primary;
  11. import org.springframework.http.converter.HttpMessageConverter;
  12. import org.springframework.http.converter.StringHttpMessageConverter;
  13. import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
  14. import org.springframework.web.method.support.HandlerMethodArgumentResolver;
  15. import org.springframework.web.servlet.config.annotation.CorsRegistry;
  16. import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
  17. import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
  18. import com.fasterxml.jackson.annotation.JsonInclude.Include;
  19. import com.fasterxml.jackson.databind.DeserializationFeature;
  20. import com.fasterxml.jackson.databind.ObjectMapper;
  21. import lombok.extern.log4j.Log4j;
  22. import lombok.extern.slf4j.Slf4j;
  23. @Configuration
  24. @Slf4j
  25. public class WebMvcConfigurer extends WebMvcConfigurationSupport {
  26. private static final String FILE_PERFIX = "file:";
  27. @Value("${app.debug.swagger}")
  28. private boolean swagger;
  29. /**
  30. * adminUser, apiUser的自动注入参数
  31. */
  32. @Override
  33. protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
  34. argumentResolvers.add(new CcUserArgumentResolver());
  35. super.addArgumentResolvers(argumentResolvers);
  36. }
  37. @Override
  38. public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
  39. converters.add(new StringHttpMessageConverter(Charset.forName("UTF-8")));
  40. // 这里必须加上加载默认转换器,不然bug玩死人,并且该bug目前在网络上似乎没有解决方案
  41. // 百度,谷歌,各大论坛等。你可以试试去掉。
  42. addDefaultHttpMessageConverters(converters);
  43. }
  44. @Override
  45. public void addResourceHandlers(ResourceHandlerRegistry registry) {
  46. //registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
  47. innerAddResourceHandlers(registry, GlobalEx.COMMON_STATICS_DIR);
  48. innerAddResourceHandlers(registry, GlobalEx.UPLOAD_DIR);
  49. innerAddResourceHandlers(registry, GlobalEx.SMALL_PICT_DIR);
  50. innerAddResourceHandlers(registry, GlobalEx.STATICS_DIR);
  51. innerAddResourceHandlers(registry, GlobalEx.TEMP_DIR);
  52. innerAddResourceHandlers(registry, GlobalEx.MANAGE_DIR);
  53. registry.addResourceHandler("/*.txt","/*.ico","/*.html").addResourceLocations(FILE_PERFIX + GlobalEx.APP_BASE_DIR + File.separator);
  54. registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); //knife4j的地址
  55. if(swagger) {
  56. log.info("Inited Api document at URI /doc.html");
  57. }
  58. registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
  59. }
  60. /**
  61. * 配置返回映射,null值字段不返回
  62. * @return
  63. */
  64. @Bean
  65. @Primary
  66. public MappingJackson2HttpMessageConverter customJackson2HttpMessageConverter(){
  67. MappingJackson2HttpMessageConverter convertor= new MappingJackson2HttpMessageConverter();
  68. ObjectMapper mapper = new ObjectMapper();
  69. mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
  70. mapper.setSerializationInclusion(Include.NON_NULL);
  71. convertor.setObjectMapper(mapper);
  72. return convertor;
  73. }
  74. private void innerAddResourceHandlers(ResourceHandlerRegistry registry, String dirName) {
  75. registry.addResourceHandler("/" + dirName + "/**").addResourceLocations(FILE_PERFIX + GlobalEx.APP_BASE_DIR + File.separator + dirName + File.separator);
  76. }
  77. @Value("${app.debug.cors:false}")
  78. private boolean cors;
  79. @Override
  80. protected void addCorsMappings(CorsRegistry registry) {
  81. if(cors) {
  82. registry.addMapping("/**")
  83. .allowedOrigins("*")
  84. .allowedMethods("GET", "HEAD", "POST","PUT", "DELETE", "OPTIONS")
  85. .allowedHeaders("*")
  86. .exposedHeaders("access-control-allow-headers",
  87. "access-control-allow-methods",
  88. "access-control-allow-origin",
  89. "access-control-max-age",
  90. "X-Frame-Options")
  91. .allowCredentials(false).maxAge(3600);
  92. }
  93. super.addCorsMappings(registry);
  94. }
  95. }