package com.casic.missiles; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.serializer.SerializeConfig; import com.alibaba.fastjson.serializer.SerializerFeature; import com.alibaba.fastjson.serializer.ToStringSerializer; import com.alibaba.fastjson.serializer.ValueFilter; import com.alibaba.fastjson.support.config.FastJsonConfig; import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; import com.casic.missiles.config.DefaultFastjsonConfig; import com.casic.missiles.config.properties.CasicProperties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.servlet.LocaleResolver; 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 org.springframework.web.servlet.i18n.CookieLocaleResolver; import java.math.BigDecimal; import java.math.BigInteger; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Locale; /** * @Description: WebMvc拦截器 * @Author: cz * @Date: 2022/11/9 15:26 */ @ServletComponentScan(basePackageClasses = {DefaultFastjsonConfig.class}) @ConditionalOnClass(com.alibaba.fastjson.JSON.class) @ConditionalOnMissingBean(FastJsonHttpMessageConverter.class) @Configuration class WebMvcConfig extends WebMvcConfigurationSupport { @Value("${spring.messages.locale:SIMPLIFIED_CHINESE}") private String locale; public WebMvcConfig() { } @Autowired private CasicProperties casicProperties; @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { //Spring Boot自动配置自己不会自动把/swagger-ui.html这个路径映射到对应的目录META-INF/resources/下面 registry.addResourceHandler("swagger-ui.html").addResourceLocations( "classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**").addResourceLocations( "classpath:/META-INF/resources/webjars/"); registry.addResourceHandler("doc.html").addResourceLocations( "classpath:/META-INF/resources/"); registry.addResourceHandler("/favicon.ico").addResourceLocations( "classpath:/META-INF/resources/"); if (StrUtil.isNotEmpty(casicProperties.getFile().getUploadPath())) { registry.addResourceHandler("/static/**").addResourceLocations("file:" + casicProperties.getFile().getUploadPath()); } super.addResourceHandlers(registry); } @Override public LocaleResolver localeResolver() { CookieLocaleResolver slr = new CookieLocaleResolver(); //设置默认区域,Locale.SIMPLIFIED_CHINESE switch (locale) { case "US": slr.setDefaultLocale(Locale.US); break; default: slr.setDefaultLocale(Locale.SIMPLIFIED_CHINESE); } //设置cookie有效期. slr.setCookieMaxAge(3600); return slr; } @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { Iterator<HttpMessageConverter<?>> iterator = converters.iterator(); //先把JackSon的消息转换器删除. 在SpringBoot2.X时代,必须要排除JackSon消息转换器。 while (iterator.hasNext()) { HttpMessageConverter<?> converter = iterator.next(); if (converter instanceof MappingJackson2HttpMessageConverter) { iterator.remove(); } } FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); converter.setFastJsonConfig(fastjsonConfig()); converter.setSupportedMediaTypes(getSupportedMediaType()); converters.add(converter); } @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOriginPatterns("*") .allowCredentials(true) .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .maxAge(3600); } /** * fastjson的配置 */ public FastJsonConfig fastjsonConfig() { FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures( SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteEnumUsingToString ); //修改,设置全局时间为精确到天,页面列表显示不带时分秒 //fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss"); fastJsonConfig.setDateFormat("yyyy-MM-dd"); ValueFilter valueFilter = new ValueFilter() { @Override public Object process(Object o, String s, Object o1) { if (null == o1) { o1 = ""; } return o1; } }; fastJsonConfig.setCharset(Charset.forName("utf-8")); fastJsonConfig.setSerializeFilters(valueFilter); //解决Long转json精度丢失的问题 SerializeConfig serializeConfig = SerializeConfig.globalInstance; serializeConfig.put(BigInteger.class, ToStringSerializer.instance); serializeConfig.put(Long.class, ToStringSerializer.instance); serializeConfig.put(BigDecimal.class, ToStringSerializer.instance); // serializeConfig.put(Long.TYPE, ToStringSerializer.instance); fastJsonConfig.setSerializeConfig(serializeConfig); return fastJsonConfig; } /** * 支持的mediaType类型 */ public List<MediaType> getSupportedMediaType() { ArrayList<MediaType> mediaTypes = new ArrayList<>(); mediaTypes.add(MediaType.APPLICATION_JSON_UTF8); return mediaTypes; } }