package cn.wisenergy.web.config; import com.alibaba.fastjson.PropertyNamingStrategy; import com.alibaba.fastjson.serializer.SerializeConfig; import com.alibaba.fastjson.serializer.SerializerFeature; import com.alibaba.fastjson.serializer.ToStringSerializer; import com.alibaba.fastjson.support.config.FastJsonConfig; import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.core.convert.converter.Converter; import org.springframework.format.FormatterRegistry; import org.springframework.http.MediaType; import org.springframework.http.converter.ByteArrayHttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.math.BigInteger; import java.nio.charset.Charset; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * MVC配置 * * @author WYY * @date 2019/4/18 */ @Configuration public class MvcConfiguration implements WebMvcConfigurer { @Value("${uploadFile.resourceHandler}") private String resourceHandler; @Value("${uploadFile.location}") private String location; /** * 后置跨域支持【当出现跨域请求,此处会放在拦截器最后执行,CORS失效】 * * @param registry */ @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedHeaders("*") .allowedMethods("*") .allowCredentials(true) .maxAge(3600); } /** * 配置消息转换器:Ali开源的fastJson * * @param converters */ @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // 先移除jackson转换器,springBoot1.x可以不排除 for (int i = converters.size() - 1; i >= 0; i--) { if (converters.get(i) instanceof MappingJackson2HttpMessageConverter) { converters.remove(i); } } //1.需要定义一个convert转换消息的对象; FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter(); StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(); ByteArrayHttpMessageConverter byteArrayHttpMessageConverter = new ByteArrayHttpMessageConverter(); //2.添加fastJson的配置信息,比如:是否要格式化返回的json数据; FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures( SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.BrowserCompatible, SerializerFeature.WriteDateUseDateFormat); // 设置编码 fastJsonConfig.setCharset(Charset.forName("UTF-8")); fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss"); // 设置数字转化问题 SerializeConfig serializeConfig = SerializeConfig.globalInstance; serializeConfig.put(BigInteger.class, ToStringSerializer.instance); serializeConfig.put(Long.class, ToStringSerializer.instance); serializeConfig.put(Long.TYPE, ToStringSerializer.instance); serializeConfig.setPropertyNamingStrategy( PropertyNamingStrategy.CamelCase); fastJsonConfig.setSerializeConfig(serializeConfig); //3处理中文乱码问题 List<MediaType> fastMediaTypes = new ArrayList<>(); fastMediaTypes.add(MediaType.APPLICATION_JSON); fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); fastMediaTypes.add(MediaType.TEXT_HTML); fastMediaTypes.add(MediaType.MULTIPART_FORM_DATA); //4.在convert中添加配置信息. fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes); fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig); //5.将convert添加到converters当中. converters.add(fastJsonHttpMessageConverter); converters.add(stringHttpMessageConverter); converters.add(byteArrayHttpMessageConverter); } /** * 启用@EnableWebMvc后,properties文件中的静态路径失效,必须覆盖后重新制定 * 配置静态访问资源 * * @param registry */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // swagger2配置 registry.addResourceHandler("swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); // 静态资源拦截 registry.addResourceHandler("/**") .addResourceLocations("classpath:/META-INF/") .addResourceLocations("classpath:/META-INF/resources/") .addResourceLocations("classpath:/resources/") .addResourceLocations("classpath:/static/") .addResourceLocations("classpath:/public/") .addResourceLocations("classpath:/"); //上传文件配置 registry.addResourceHandler(resourceHandler) .addResourceLocations("file:///"+location); } @Override public void addFormatters(FormatterRegistry registry) { registry.addConverter(new Converter<String, Date>(){ @Override public Date convert(String source) { SimpleDateFormat simpleDateFormat; if (source.contains(" ")) { simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); } else { simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); } try { return simpleDateFormat.parse(source); } catch (ParseException e) { e.printStackTrace(); } return null; } }); } }