Jelajahi Sumber

修改core-retrofit的ObjectMapper配置,兼容不存在的属性

Signed-off-by: luoshi <luoshi@qmth.com.cn>
luoshi 3 tahun lalu
induk
melakukan
9e9de48fdb

+ 4 - 0
core-retrofit/pom.xml

@@ -40,6 +40,10 @@
             <groupId>com.fasterxml.jackson.core</groupId>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>
             <artifactId>jackson-databind</artifactId>
         </dependency>
         </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-jsr310</artifactId>
+        </dependency>
         <dependency>
         <dependency>
             <groupId>com.squareup.retrofit2</groupId>
             <groupId>com.squareup.retrofit2</groupId>
             <artifactId>retrofit</artifactId>
             <artifactId>retrofit</artifactId>

+ 23 - 1
core-retrofit/src/main/java/com/qmth/boot/core/retrofit/core/RetrofitFactoryBean.java

@@ -1,5 +1,13 @@
 package com.qmth.boot.core.retrofit.core;
 package com.qmth.boot.core.retrofit.core;
 
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
 import com.qmth.boot.core.retrofit.annotatioin.RetrofitClient;
 import com.qmth.boot.core.retrofit.annotatioin.RetrofitClient;
 import com.qmth.boot.core.retrofit.config.RetrofitProperties;
 import com.qmth.boot.core.retrofit.config.RetrofitProperties;
 import com.qmth.boot.core.retrofit.interceptor.ErrorDecodeInterceptor;
 import com.qmth.boot.core.retrofit.interceptor.ErrorDecodeInterceptor;
@@ -29,8 +37,22 @@ public class RetrofitFactoryBean<T> implements FactoryBean<T>, ApplicationContex
 
 
     private RetrofitProperties retrofitProperties;
     private RetrofitProperties retrofitProperties;
 
 
+    private ObjectMapper mapper;
+
     public RetrofitFactoryBean(Class<T> retrofitInterface) {
     public RetrofitFactoryBean(Class<T> retrofitInterface) {
         this.retrofitInterface = retrofitInterface;
         this.retrofitInterface = retrofitInterface;
+        // 初始化ObjectMapper
+        ObjectMapper mapper = new ObjectMapper();
+        // 反序列化时,允许有未知字段
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        // 默认不序列化空值
+        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
+        // 解决jackson2无法反序列化LocalDateTime的问题
+        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+        mapper.registerModule(new JavaTimeModule());
+        this.mapper = mapper;
     }
     }
 
 
     @Override
     @Override
@@ -60,7 +82,7 @@ public class RetrofitFactoryBean<T> implements FactoryBean<T>, ApplicationContex
         OkHttpClient client = getOkHttpClient(retrofitClient, customize);
         OkHttpClient client = getOkHttpClient(retrofitClient, customize);
         Retrofit.Builder retrofitBuilder = new Retrofit.Builder().baseUrl(getBaseUrl(retrofitClient, customize))
         Retrofit.Builder retrofitBuilder = new Retrofit.Builder().baseUrl(getBaseUrl(retrofitClient, customize))
                 .addConverterFactory(ScalarsConverterFactory.create())
                 .addConverterFactory(ScalarsConverterFactory.create())
-                .addConverterFactory(JacksonConverterFactory.create()).validateEagerly(true).client(client);
+                .addConverterFactory(JacksonConverterFactory.create(mapper)).validateEagerly(true).client(client);
         if (retrofitClient.directReturn()) {
         if (retrofitClient.directReturn()) {
             retrofitBuilder.addCallAdapterFactory(new DirectCallAdapterFactory());
             retrofitBuilder.addCallAdapterFactory(new DirectCallAdapterFactory());
         }
         }