mirror of
https://github.com/dromara/payment-spring-boot.git
synced 2026-03-13 21:33:41 +08:00
自定义messageConverter
This commit is contained in:
@@ -2,8 +2,17 @@ package com.enongm.dianji.payment.wechat.v3;
|
||||
|
||||
import org.springframework.http.*;
|
||||
import org.springframework.http.converter.*;
|
||||
import org.springframework.http.converter.json.GsonHttpMessageConverter;
|
||||
import org.springframework.http.converter.json.JsonbHttpMessageConverter;
|
||||
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
|
||||
import org.springframework.http.converter.smile.MappingJackson2SmileHttpMessageConverter;
|
||||
import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter;
|
||||
import org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter;
|
||||
import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter;
|
||||
import org.springframework.http.converter.xml.SourceHttpMessageConverter;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.ClassUtils;
|
||||
import org.springframework.util.MultiValueMap;
|
||||
import org.springframework.util.StreamUtils;
|
||||
|
||||
@@ -16,26 +25,77 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* The type Upload http message converter.
|
||||
* @see AllEncompassingFormHttpMessageConverter
|
||||
*/
|
||||
final class UploadHttpMessageConverter extends FormHttpMessageConverter {
|
||||
final class ExtensionFormHttpMessageConverter extends FormHttpMessageConverter {
|
||||
private static final String BOUNDARY = "boundary";
|
||||
|
||||
|
||||
private static final boolean jaxb2Present;
|
||||
|
||||
private static final boolean jackson2Present;
|
||||
|
||||
private static final boolean jackson2XmlPresent;
|
||||
|
||||
private static final boolean jackson2SmilePresent;
|
||||
|
||||
private static final boolean gsonPresent;
|
||||
|
||||
private static final boolean jsonbPresent;
|
||||
|
||||
private final List<HttpMessageConverter<?>> partConverters = new ArrayList<>();
|
||||
|
||||
static {
|
||||
ClassLoader classLoader = AllEncompassingFormHttpMessageConverter.class.getClassLoader();
|
||||
jaxb2Present = ClassUtils.isPresent("javax.xml.bind.Binder", classLoader);
|
||||
jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader) &&
|
||||
ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);
|
||||
jackson2XmlPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", classLoader);
|
||||
jackson2SmilePresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory", classLoader);
|
||||
gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", classLoader);
|
||||
jsonbPresent = ClassUtils.isPresent("javax.json.bind.Jsonb", classLoader);
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a new Upload http message converter.
|
||||
*/
|
||||
public UploadHttpMessageConverter() {
|
||||
public ExtensionFormHttpMessageConverter() {
|
||||
StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
|
||||
stringHttpMessageConverter.setWriteAcceptCharset(false); // see SPR-7316
|
||||
|
||||
this.partConverters.add(new ByteArrayHttpMessageConverter());
|
||||
this.partConverters.add(stringHttpMessageConverter);
|
||||
this.partConverters.add(new ResourceHttpMessageConverter());
|
||||
try {
|
||||
this.partConverters.add(new SourceHttpMessageConverter<>());
|
||||
} catch (Error err) {
|
||||
// Ignore when no TransformerFactory implementation is available
|
||||
}
|
||||
|
||||
if (jaxb2Present && !jackson2XmlPresent) {
|
||||
this.partConverters.add(new Jaxb2RootElementHttpMessageConverter());
|
||||
}
|
||||
|
||||
if (jackson2Present) {
|
||||
this.partConverters.add(new MappingJackson2HttpMessageConverter());
|
||||
} else if (gsonPresent) {
|
||||
this.partConverters.add(new GsonHttpMessageConverter());
|
||||
} else if (jsonbPresent) {
|
||||
this.partConverters.add(new JsonbHttpMessageConverter());
|
||||
}
|
||||
|
||||
if (jackson2XmlPresent) {
|
||||
this.partConverters.add(new MappingJackson2XmlHttpMessageConverter());
|
||||
}
|
||||
|
||||
if (jackson2SmilePresent) {
|
||||
this.partConverters.add(new MappingJackson2SmileHttpMessageConverter());
|
||||
}
|
||||
this.setPartConverters(this.partConverters);
|
||||
applyDefaultCharset();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Apply the configured charset as a default to registered part converters.
|
||||
*/
|
||||
@@ -50,6 +110,7 @@ final class UploadHttpMessageConverter extends FormHttpMessageConverter {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public void write(MultiValueMap<String, ?> map, @Nullable MediaType contentType, HttpOutputMessage outputMessage)
|
||||
@@ -190,6 +251,7 @@ final class UploadHttpMessageConverter extends FormHttpMessageConverter {
|
||||
os.write('\r');
|
||||
os.write('\n');
|
||||
}
|
||||
|
||||
private static class MultipartHttpOutputMessage implements HttpOutputMessage {
|
||||
|
||||
private final OutputStream outputStream;
|
||||
@@ -9,6 +9,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
import lombok.SneakyThrows;
|
||||
import org.springframework.http.*;
|
||||
import org.springframework.http.converter.HttpMessageConverter;
|
||||
import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.web.client.DefaultResponseErrorHandler;
|
||||
import org.springframework.web.client.RestOperations;
|
||||
@@ -30,6 +31,7 @@ import java.util.function.Consumer;
|
||||
*/
|
||||
public class WechatPayClient {
|
||||
private final SignatureProvider signatureProvider;
|
||||
private RestOperations restOperations;
|
||||
|
||||
/**
|
||||
* Instantiates a new Wechat pay service.
|
||||
@@ -38,6 +40,7 @@ public class WechatPayClient {
|
||||
*/
|
||||
public WechatPayClient(SignatureProvider signatureProvider) {
|
||||
this.signatureProvider = signatureProvider;
|
||||
applyDefaultRestTemplate();
|
||||
}
|
||||
|
||||
|
||||
@@ -50,7 +53,7 @@ public class WechatPayClient {
|
||||
* @return the executor
|
||||
*/
|
||||
public <M> Executor<M> withType(WechatPayV3Type wechatPayV3Type, M m) {
|
||||
return new Executor<>(wechatPayV3Type, m, this.signatureProvider);
|
||||
return new Executor<>(wechatPayV3Type, m, this.signatureProvider,this.restOperations);
|
||||
}
|
||||
|
||||
|
||||
@@ -61,10 +64,10 @@ public class WechatPayClient {
|
||||
*/
|
||||
public static class Executor<M> {
|
||||
/**
|
||||
* The V 3 pay type.
|
||||
* The V3 pay type.
|
||||
*/
|
||||
private final WechatPayV3Type wechatPayV3Type;
|
||||
private RestOperations restOperations;
|
||||
private final RestOperations restOperations;
|
||||
private final SignatureProvider signatureProvider;
|
||||
private final M model;
|
||||
|
||||
@@ -85,14 +88,13 @@ public class WechatPayClient {
|
||||
* @param model the model
|
||||
* @param signatureProvider the signature provider
|
||||
*/
|
||||
public Executor(WechatPayV3Type wechatPayV3Type,
|
||||
Executor(WechatPayV3Type wechatPayV3Type,
|
||||
M model,
|
||||
SignatureProvider signatureProvider) {
|
||||
SignatureProvider signatureProvider, RestOperations restOperations) {
|
||||
this.wechatPayV3Type = wechatPayV3Type;
|
||||
this.model = model;
|
||||
this.signatureProvider = signatureProvider;
|
||||
|
||||
applyDefaultRestTemplate();
|
||||
this.restOperations = restOperations;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -128,16 +130,6 @@ public class WechatPayClient {
|
||||
this.doExecute(this.header(wechatRequestEntity));
|
||||
}
|
||||
|
||||
private void applyDefaultRestTemplate() {
|
||||
RestTemplate restTemplate = new RestTemplate();
|
||||
DefaultResponseErrorHandler errorHandler = new WechatPayResponseErrorHandler();
|
||||
restTemplate.setErrorHandler(errorHandler);
|
||||
List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();
|
||||
// upload
|
||||
messageConverters.add(new UploadHttpMessageConverter());
|
||||
restTemplate.setMessageConverters(messageConverters);
|
||||
this.restOperations = restTemplate;
|
||||
}
|
||||
|
||||
/**
|
||||
* 构造私钥签名.
|
||||
@@ -215,4 +207,15 @@ public class WechatPayClient {
|
||||
|
||||
}
|
||||
|
||||
private void applyDefaultRestTemplate() {
|
||||
RestTemplate restTemplate = new RestTemplate();
|
||||
DefaultResponseErrorHandler errorHandler = new WechatPayResponseErrorHandler();
|
||||
restTemplate.setErrorHandler(errorHandler);
|
||||
List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();
|
||||
|
||||
messageConverters.removeIf(httpMessageConverter -> httpMessageConverter instanceof AllEncompassingFormHttpMessageConverter);
|
||||
messageConverters.add(new ExtensionFormHttpMessageConverter());
|
||||
restTemplate.setMessageConverters(messageConverters);
|
||||
this.restOperations = restTemplate;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user