소스 검색

fix单体服务布署

Eric 1 년 전
부모
커밋
eee27b0195

+ 187 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/config/JacksonConfig.java

@@ -0,0 +1,187 @@
+package com.yonge.cooleshow.config;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
+import org.springframework.boot.autoconfigure.AutoConfigureBefore;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
+import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
+import java.util.TimeZone;
+
+/**
+ * JSON LocalDateTime 序列化、反序列化配置
+ */
+@Configuration
+@ConditionalOnClass(ObjectMapper.class)
+@AutoConfigureBefore(JacksonAutoConfiguration.class)
+public class JacksonConfig {
+
+    public static final String NORM_DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; // 时间格式
+    public static final String NORM_DATE_PATTERN = "yyyy-MM-dd";
+    public static final String NORM_TIME_PATTERN = "HH:mm:ss";
+    //public static final String NORM_TIME_ZONE = "GMT+8"; // 时区设置
+    /**
+     * 时区配置
+     */
+    @Bean
+    public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() {
+        return builder -> {
+
+            // 配置Date的格式化
+            builder.locale(Locale.CHINA);
+            builder.timeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+            builder.simpleDateFormat(NORM_DATETIME_PATTERN);
+
+            // 配置Jackson转换配置
+            //builder.configure(new JacksonObjectMapper());
+
+            //builder.serializationInclusion(JsonInclude.Include.USE_DEFAULTS);
+        };
+    }
+
+    /**
+     * 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
+     * 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
+     * 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
+     */
+    public static class JacksonObjectMapper extends ObjectMapper {
+
+        public JacksonObjectMapper() {
+            super();
+            //反序列化的时候如果多了其他属性,不抛出异常
+            this.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
+                    //.configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true)
+                    //不注释,会导致swagger报错
+                    //.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL)
+                    //关闭日期序列化为时间戳的功能
+                    //.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
+                    //关闭序列化的时候没有为属性找到getter方法,报错
+                    //.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)
+                    //关闭反序列化的时候,没有找到属性的setter报错
+                    //.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
+                    //序列化的时候序列对象的所有属性
+                    //.setSerializationInclusion(JsonInclude.Include.ALWAYS)
+                    //如果是空对象的时候,不抛异常
+                    //.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
+                    //反序列化时,属性不存在的兼容处理
+                    //.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
+                    .setDateFormat(new SimpleDateFormat(NORM_DATETIME_PATTERN, Locale.SIMPLIFIED_CHINESE))
+                    .setLocale(Locale.CHINA)
+                    .setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+
+                    SimpleModule simpleModule = new SimpleModule()
+                    // 时间对象反序列化
+                    .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(NORM_DATETIME_PATTERN)))
+                    .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(NORM_DATE_PATTERN)))
+                    .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(NORM_TIME_PATTERN)))
+
+                    // 时间对象序列化
+                    .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(NORM_DATETIME_PATTERN)))
+                    .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(NORM_DATE_PATTERN)))
+                    .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(NORM_TIME_PATTERN)))
+
+                    // Long对象转String
+                    //.addSerializer(Float.class, new FloatJsonSerializer())
+                    //.addSerializer(Float.TYPE, new FloatJsonSerializer())
+
+                    .addSerializer(Long.class, ToStringSerializer.instance)
+                    .addSerializer(Long.TYPE, ToStringSerializer.instance)
+
+                    .addSerializer(BigDecimal.class, new BigDecimalJsonSerializer())
+                    .addSerializer(BigInteger.class, ToStringSerializer.instance)
+
+                    .addSerializer(Double.class, new DoubleJsonSerializer())
+                    .addSerializer(Double.TYPE, new DoubleJsonSerializer());
+
+
+
+            //注册功能模块 例如,可以添加自定义序列化器和反序列化器
+            this.registerModule(simpleModule);
+        }
+    }
+
+    /**
+     * Double精度处理
+     * #@JsonSerialize(using = JacksonConvertConfig.DoubleJsonSerializer.class)
+     */
+    public static class DoubleJsonSerializer extends JsonSerializer<Double> {
+
+        @Override
+        public void serialize(Double arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException {
+            if(arg0 != null) {
+                getJsonConvertValue(arg1, new BigDecimal(String.valueOf(arg0)));
+            }
+        }
+    }
+
+    /**
+     * JSON数据转换
+     * @param arg1 JsonGenerator
+     * @param bigDecimal BigDecimal
+     * @throws IOException IOException
+     */
+    private static void getJsonConvertValue(JsonGenerator arg1, BigDecimal bigDecimal) throws IOException {
+
+        // 原本这里是  ##.00 ,带来的问题是如果数据库数据为0.00返回“ .00 “经评论指正,改为0.00
+        DecimalFormat decimalFormat = new DecimalFormat("#.00");
+
+        decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
+        //四舍五入。需要将数据转成bigDecimal, 否则会存在经度丢失问题
+        String format = decimalFormat.format(bigDecimal);
+
+        arg1.writeNumber(new BigDecimal(format));//返回数字格式
+    }
+
+    /**
+     * BigDecimal精度处理
+     * #@JsonSerialize(using = JacksonConvertConfig.BigDecimalJsonSerializer.class)
+     */
+    public static class BigDecimalJsonSerializer extends JsonSerializer<BigDecimal> {
+
+        @Override
+        public void serialize(BigDecimal arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException {
+            if(arg0 != null) {
+                getJsonConvertValue(arg1, arg0);
+            }
+        }
+    }
+
+    /**
+     * Float精度处理
+     * #@JsonSerialize(using = JacksonConvertConfig.FloatJsonSerializer.class)
+     */
+    public static class FloatJsonSerializer extends JsonSerializer<Float> {
+
+        @Override
+        public void serialize(Float arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException {
+            if(arg0 != null) {
+                getJsonConvertValue(arg1, new BigDecimal(String.valueOf(arg0)));
+            }
+        }
+    }
+}

+ 49 - 2
cooleshow-app/src/main/java/com/yonge/cooleshow/config/WebMvcConfig.java

@@ -1,18 +1,24 @@
 package com.yonge.cooleshow.config;
 
+import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
+import com.google.common.collect.Lists;
+import com.microsvc.toolkit.common.webportal.converter.MappingJSONHttpMessageConverter;
 import com.yonge.cooleshow.biz.dal.config.LocalFastJsonHttpMessageConverter;
 import com.yonge.cooleshow.common.config.EnumConverterFactory;
 import com.yonge.cooleshow.interceptor.MDCInterceptor;
 import com.yonge.cooleshow.interceptor.OperationLogInterceptor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
-import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
 import org.springframework.format.FormatterRegistry;
 import org.springframework.http.MediaType;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.StringHttpMessageConverter;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -43,7 +49,48 @@ public class WebMvcConfig implements WebMvcConfigurer {
 		registry.addInterceptor(operationLogInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
 	}
 
-	@Bean
+	/**
+	 * @param converters List<HttpMessageConverter<?>>
+	 */
+	@Override
+	public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
+		//WebMvcConfigurer.super.configureMessageConverters(converters);
+
+		// 如果存在fastJson的转换器,将其移除
+		converters.removeIf(httpMessageConverter -> httpMessageConverter instanceof FastJsonHttpMessageConverter);
+
+		// 需要重新加入jackson的转换器,该处的objectMapper已经在配置中注册了
+		com.microsvc.toolkit.common.webportal.converter.MappingJSONHttpMessageConverter converter = new MappingJSONHttpMessageConverter(new JacksonConfig.JacksonObjectMapper());
+		converter.setDefaultCharset(StandardCharsets.UTF_8); // 字符编号
+		converters.add(0, converter);
+
+		// 添加String转换器
+		converters.add(utf8StringHttpMessageConverter());
+	}
+
+	/**
+	 * 自定义String转换器
+	 * @return HttpMessageConverters
+	 */
+	//@Bean
+	@Primary
+	public StringHttpMessageConverter utf8StringHttpMessageConverter() {
+
+		StringHttpMessageConverter converter = new StringHttpMessageConverter();
+
+		List<MediaType> mediaTypes = Lists.newArrayList();
+		mediaTypes.add(MediaType.TEXT_HTML);
+		mediaTypes.add(MediaType.TEXT_PLAIN);
+		mediaTypes.add(MediaType.TEXT_XML);
+		mediaTypes.add(MediaType.APPLICATION_XML);
+
+		converter.setSupportedMediaTypes(mediaTypes);
+		converter.setDefaultCharset(StandardCharsets.UTF_8);
+
+		return converter;
+	}
+
+	//@Bean
 	public HttpMessageConverters fastJsonHttpMessageConverters() {
 		LocalFastJsonHttpMessageConverter converter = new LocalFastJsonHttpMessageConverter();
 		List<MediaType> fastMediaTypes = new ArrayList<MediaType>();