|
@@ -1,5 +1,12 @@
|
|
|
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.datatype.jsr310.JavaTimeModule;
|
|
|
import com.qmth.boot.core.retrofit.annotatioin.RetrofitClient;
|
|
|
import com.qmth.boot.core.retrofit.config.RetrofitProperties;
|
|
|
import com.qmth.boot.core.retrofit.interceptor.ErrorDecodeInterceptor;
|
|
@@ -7,7 +14,8 @@ import com.qmth.boot.core.retrofit.interceptor.LoggingInterceptor;
|
|
|
import com.qmth.boot.core.retrofit.interceptor.RetryInterceptor;
|
|
|
import com.qmth.boot.core.retrofit.interceptor.SignatureInterceptor;
|
|
|
import com.qmth.boot.core.retrofit.interfaces.CustomizeRetrofitConfiguration;
|
|
|
-import com.qmth.boot.core.retrofit.interfaces.SignatureProvider;
|
|
|
+import io.micrometer.core.instrument.MeterRegistry;
|
|
|
+import io.micrometer.core.instrument.binder.okhttp3.OkHttpMetricsEventListener;
|
|
|
import okhttp3.ConnectionPool;
|
|
|
import okhttp3.OkHttpClient;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
@@ -18,6 +26,7 @@ import org.springframework.context.ApplicationContext;
|
|
|
import org.springframework.context.ApplicationContextAware;
|
|
|
import retrofit2.Retrofit;
|
|
|
import retrofit2.converter.jackson.JacksonConverterFactory;
|
|
|
+import retrofit2.converter.scalars.ScalarsConverterFactory;
|
|
|
|
|
|
import java.lang.reflect.Proxy;
|
|
|
|
|
@@ -29,8 +38,23 @@ public class RetrofitFactoryBean<T> implements FactoryBean<T>, ApplicationContex
|
|
|
|
|
|
private RetrofitProperties retrofitProperties;
|
|
|
|
|
|
+ private MeterRegistry meterRegistry;
|
|
|
+
|
|
|
+ private ObjectMapper mapper;
|
|
|
+
|
|
|
public RetrofitFactoryBean(Class<T> 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);
|
|
|
+ // 解决jackson2无法反序列化LocalDateTime的问题
|
|
|
+ mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
|
|
|
+ mapper.registerModule(new JavaTimeModule());
|
|
|
+ this.mapper = mapper;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -59,7 +83,8 @@ public class RetrofitFactoryBean<T> implements FactoryBean<T>, ApplicationContex
|
|
|
|
|
|
OkHttpClient client = getOkHttpClient(retrofitClient, customize);
|
|
|
Retrofit.Builder retrofitBuilder = new Retrofit.Builder().baseUrl(getBaseUrl(retrofitClient, customize))
|
|
|
- .addConverterFactory(JacksonConverterFactory.create()).validateEagerly(true).client(client);
|
|
|
+ .addConverterFactory(ScalarsConverterFactory.create())
|
|
|
+ .addConverterFactory(JacksonConverterFactory.create(mapper)).validateEagerly(true).client(client);
|
|
|
if (retrofitClient.directReturn()) {
|
|
|
retrofitBuilder.addCallAdapterFactory(new DirectCallAdapterFactory());
|
|
|
}
|
|
@@ -73,13 +98,12 @@ public class RetrofitFactoryBean<T> implements FactoryBean<T>, ApplicationContex
|
|
|
* @return OkHttpClient instance
|
|
|
*/
|
|
|
private OkHttpClient getOkHttpClient(RetrofitClient retrofitClient, CustomizeRetrofitConfiguration customize) {
|
|
|
- OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder().connectionPool(new ConnectionPool());
|
|
|
+ OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder().connectionPool(new ConnectionPool())
|
|
|
+ .connectTimeout(retrofitProperties.getConnectTimeout()).readTimeout(retrofitProperties.getReadTimeout())
|
|
|
+ .writeTimeout(retrofitProperties.getWriteTimeout());
|
|
|
|
|
|
// add signature interceptor
|
|
|
- SignatureProvider provider = customize.getSignature();
|
|
|
- if (provider != null) {
|
|
|
- okHttpClientBuilder.addInterceptor(new SignatureInterceptor(provider));
|
|
|
- }
|
|
|
+ okHttpClientBuilder.addInterceptor(new SignatureInterceptor(customize.getSignature()));
|
|
|
|
|
|
// add ErrorDecodeInterceptor
|
|
|
okHttpClientBuilder.addInterceptor(new ErrorDecodeInterceptor());
|
|
@@ -93,6 +117,12 @@ public class RetrofitFactoryBean<T> implements FactoryBean<T>, ApplicationContex
|
|
|
okHttpClientBuilder.addNetworkInterceptor(new LoggingInterceptor(logLevel));
|
|
|
}
|
|
|
|
|
|
+ // add metrics event listener
|
|
|
+ if (meterRegistry != null) {
|
|
|
+ okHttpClientBuilder
|
|
|
+ .eventListener(OkHttpMetricsEventListener.builder(meterRegistry, "okhttp.client").build());
|
|
|
+ }
|
|
|
+
|
|
|
return okHttpClientBuilder.build();
|
|
|
}
|
|
|
|
|
@@ -116,6 +146,7 @@ public class RetrofitFactoryBean<T> implements FactoryBean<T>, ApplicationContex
|
|
|
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
|
|
this.applicationContext = applicationContext;
|
|
|
this.retrofitProperties = applicationContext.getBean(RetrofitProperties.class);
|
|
|
+ this.meterRegistry = applicationContext.getBean(MeterRegistry.class);
|
|
|
}
|
|
|
|
|
|
}
|