package com.iformall.config; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.DeserializationConfig; 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 com.iformall.file.aliyun.AliyunOSS; import com.iformall.interceptor.CurrentTenantInterceptor; import com.iformall.interceptor.HttpServletRequestWrapperFilter; import com.iformall.interceptor.RequestInterceptor; import com.iformall.service.MallResourceService; import com.iformall.ueditor.ActionEnter; import com.iformall.ueditor.ConfigManager; import com.iformall.ueditor.UEditorConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CharacterEncodingFilter; import org.springframework.web.filter.CorsFilter; import org.springframework.web.servlet.config.annotation.*; import javax.servlet.Filter; import java.math.BigDecimal; import java.math.BigInteger; import java.text.SimpleDateFormat; import java.util.List; @Configuration @EnableWebMvc @EnableConfigurationProperties({UEditorConfig.class, AwsProperty.class}) public class WebConfig implements WebMvcConfigurer { @Autowired private UEditorConfig uEditorConfig; @Autowired private AwsProperty awsProperty; @Autowired private RequestInterceptor requestInterceptor; @Autowired private CurrentTenantInterceptor tenantInterceptor; @Autowired private MallResourceService mallResourceService; @Autowired private AliyunOSS aliyunOSS; @Bean @ConditionalOnMissingBean(ActionEnter.class) public ActionEnter actionEnter() { ActionEnter actionEnter = new ActionEnter(ConfigManager.getInstance(uEditorConfig, awsProperty, mallResourceService, aliyunOSS)); return actionEnter; } @Bean public CorsFilter corsFilter() { final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource(); final CorsConfiguration corsConfiguration = new CorsConfiguration(); // 允许cookies跨域 corsConfiguration.setAllowCredentials(true); // 允许向该服务器提交请求的URI, *表示全部允许 corsConfiguration.addAllowedOrigin("*"); // 允许访问的头信息,*表示全部 corsConfiguration.addAllowedHeader("*"); // 允许提交请求的方法, *表示全部允许 corsConfiguration.addAllowedMethod("*"); urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration); return new CorsFilter(urlBasedCorsConfigurationSource); } /** * 用于处理编码问题 * * @return */ @Bean("myCharacterEncodingFilter") public Filter characterEncodingFilter() { CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); characterEncodingFilter.setEncoding("UTF-8"); characterEncodingFilter.setForceEncoding(true); return characterEncodingFilter; } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(requestInterceptor).addPathPatterns("/**"); registry.addInterceptor(tenantInterceptor).addPathPatterns("/**"); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // registry.addResourceHandler("swagger-ui.html") // .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("doc.html") .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); // ueditor registry.addResourceHandler("/upload/**") .addResourceLocations("file:" + uEditorConfig.getUploadPath()); registry.addResourceHandler("/config.json").addResourceLocations("classpath:/config.json"); } @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowCredentials(true) .allowedMethods("GET", "POST", "DELETE", "PUT") .maxAge(3600); } @Override public void configureMessageConverters(List> converters) { MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); //ObjectMapper 是Jackson库的主要类。它提供一些功能将转换成Java对象匹配JSON结构,反之亦然 ObjectMapper objectMapper = new ObjectMapper(); SimpleModule simpleModule = new SimpleModule(); //不显示为null的字段 objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); DeserializationConfig dc = objectMapper.getDeserializationConfig(); // 设置反序列化日期格式、忽略不存在get、set的属性 objectMapper.setConfig( dc.with(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")) .without(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) ); //序列化将Long转String类型 simpleModule.addSerializer(Long.class, ToStringSerializer.instance); simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); SimpleModule bigIntegerModule = new SimpleModule(); //序列化将BigInteger转String类型 bigIntegerModule.addSerializer(BigInteger.class, ToStringSerializer.instance); SimpleModule bigDecimalModule = new SimpleModule(); //序列化将BigDecimal转String类型 bigDecimalModule.addSerializer(BigDecimal.class, ToStringSerializer.instance); objectMapper.registerModule(simpleModule); objectMapper.registerModule(bigDecimalModule); objectMapper.registerModule(bigIntegerModule); jackson2HttpMessageConverter.setObjectMapper(objectMapper); converters.add(jackson2HttpMessageConverter); } @Bean public FilterRegistrationBean Filters() { FilterRegistrationBean registrationBean = new FilterRegistrationBean(); registrationBean.setFilter(new HttpServletRequestWrapperFilter()); registrationBean.addUrlPatterns("/*"); registrationBean.setName("koalaSignFilter"); return registrationBean; } }