Merge branch 'develop' of ssh://source.supwisdom.com:12388/leave-school/microservice into develop
diff --git a/leaveschool/client/src/main/java/com/supwisdom/leaveschool/client/ClientApplication.java b/leaveschool/client/src/main/java/com/supwisdom/leaveschool/client/ClientApplication.java
index 58b71fe..181f6a5 100644
--- a/leaveschool/client/src/main/java/com/supwisdom/leaveschool/client/ClientApplication.java
+++ b/leaveschool/client/src/main/java/com/supwisdom/leaveschool/client/ClientApplication.java
@@ -11,6 +11,7 @@
import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
import com.supwisdom.infras.security.configure.api.EnableInfrasApiSecurity;
import com.supwisdom.infras.security.configure.oauth2.EnableInfrasOAuth2;
+import com.supwisdom.leaveschool.feign.CharlesRequestInterceptor;
@SpringBootApplication
@EnableCircuitBreaker
@@ -24,6 +25,12 @@
SpringApplication.run(ClientApplication.class, args);
}
+
+ @Bean
+ public CharlesRequestInterceptor charlesRequestInterceptor(){
+ return new CharlesRequestInterceptor();
+ }
+
@Bean
public ServletRegistrationBean<HystrixMetricsStreamServlet> hystrixMetricsStreamServlet() {
diff --git a/leaveschool/client/src/main/java/com/supwisdom/leaveschool/feign/CharlesRequestInterceptor.java b/leaveschool/client/src/main/java/com/supwisdom/leaveschool/feign/CharlesRequestInterceptor.java
new file mode 100644
index 0000000..181c396
--- /dev/null
+++ b/leaveschool/client/src/main/java/com/supwisdom/leaveschool/feign/CharlesRequestInterceptor.java
@@ -0,0 +1,74 @@
+package com.supwisdom.leaveschool.feign;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+
+public class CharlesRequestInterceptor implements RequestInterceptor {
+
+ @Autowired
+ private ObjectMapper objectMapper;
+
+ @Override
+ public void apply(RequestTemplate template) {
+ // feign 不支持 GET 方法传 POJO, json body转query
+ if (template.method().equals("GET") && template.body() != null) {
+ try {
+ JsonNode jsonNode = objectMapper.readTree(template.body());
+ template.body(null);
+ Map<String, Collection<String>> queries = new HashMap<>();
+ buildQuery(jsonNode, "", queries);
+ template.queries(queries);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private void buildQuery(JsonNode jsonNode, String path, Map<String, Collection<String>> queries) {
+ if (!jsonNode.isContainerNode()) {
+ // 叶子节点
+ if (jsonNode.isNull()) {
+ return;
+ }
+ Collection<String> values = queries.get(path);
+ if (null == values) {
+ values = new ArrayList<>();
+ queries.put(path, values);
+ }
+ values.add(jsonNode.asText());
+ return;
+ }
+ if (jsonNode.isArray()) { // 数组节点
+ Iterator<JsonNode> it = jsonNode.elements();
+ while (it.hasNext()) {
+ buildQuery(it.next(), path, queries);
+ }
+ } else {
+ Iterator<Map.Entry<String, JsonNode>> it = jsonNode.fields();
+ while (it.hasNext()) {
+ Map.Entry<String, JsonNode> entry = it.next();
+ if (StringUtils.hasText(path)) {
+ buildQuery(entry.getValue(), path + "." + entry.getKey(), queries);
+ } else {
+ // 根节点
+ buildQuery(entry.getValue(), entry.getKey(), queries);
+ }
+ }
+ }
+
+ }
+
+}
diff --git a/samples/client/src/main/java/com/supwisdom/leaveschool/client/ClientApplication.java b/samples/client/src/main/java/com/supwisdom/leaveschool/client/ClientApplication.java
index ff95ef5..1de9e95 100644
--- a/samples/client/src/main/java/com/supwisdom/leaveschool/client/ClientApplication.java
+++ b/samples/client/src/main/java/com/supwisdom/leaveschool/client/ClientApplication.java
@@ -15,6 +15,7 @@
import com.supwisdom.infras.security.configure.api.EnableInfrasApiSecurity;
import com.supwisdom.infras.security.configure.oauth2.EnableInfrasOAuth2;
import com.supwisdom.infras.security.configure.web.EnableInfrasWebSecurity;
+import com.supwisdom.leaveschool.feign.CharlesRequestInterceptor;
@SpringBootApplication
@EnableCircuitBreaker
@@ -29,6 +30,10 @@
SpringApplication.run(ClientApplication.class, args);
}
+ @Bean
+ public CharlesRequestInterceptor charlesRequestInterceptor(){
+ return new CharlesRequestInterceptor();
+ }
@Bean
public ServletRegistrationBean<HystrixMetricsStreamServlet> hystrixMetricsStreamServlet() {
diff --git a/samples/client/src/main/java/com/supwisdom/leaveschool/feign/CharlesRequestInterceptor.java b/samples/client/src/main/java/com/supwisdom/leaveschool/feign/CharlesRequestInterceptor.java
new file mode 100644
index 0000000..181c396
--- /dev/null
+++ b/samples/client/src/main/java/com/supwisdom/leaveschool/feign/CharlesRequestInterceptor.java
@@ -0,0 +1,74 @@
+package com.supwisdom.leaveschool.feign;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+
+public class CharlesRequestInterceptor implements RequestInterceptor {
+
+ @Autowired
+ private ObjectMapper objectMapper;
+
+ @Override
+ public void apply(RequestTemplate template) {
+ // feign 不支持 GET 方法传 POJO, json body转query
+ if (template.method().equals("GET") && template.body() != null) {
+ try {
+ JsonNode jsonNode = objectMapper.readTree(template.body());
+ template.body(null);
+ Map<String, Collection<String>> queries = new HashMap<>();
+ buildQuery(jsonNode, "", queries);
+ template.queries(queries);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private void buildQuery(JsonNode jsonNode, String path, Map<String, Collection<String>> queries) {
+ if (!jsonNode.isContainerNode()) {
+ // 叶子节点
+ if (jsonNode.isNull()) {
+ return;
+ }
+ Collection<String> values = queries.get(path);
+ if (null == values) {
+ values = new ArrayList<>();
+ queries.put(path, values);
+ }
+ values.add(jsonNode.asText());
+ return;
+ }
+ if (jsonNode.isArray()) { // 数组节点
+ Iterator<JsonNode> it = jsonNode.elements();
+ while (it.hasNext()) {
+ buildQuery(it.next(), path, queries);
+ }
+ } else {
+ Iterator<Map.Entry<String, JsonNode>> it = jsonNode.fields();
+ while (it.hasNext()) {
+ Map.Entry<String, JsonNode> entry = it.next();
+ if (StringUtils.hasText(path)) {
+ buildQuery(entry.getValue(), path + "." + entry.getKey(), queries);
+ } else {
+ // 根节点
+ buildQuery(entry.getValue(), entry.getKey(), queries);
+ }
+ }
+ }
+
+ }
+
+}