Skip to content

Commit 64227d7

Browse files
authored
Merge pull request #513 from UbaidurRehman1/enhancement/gh-340-api-gateway
update config server and discovery server to fix spring fox exception with spring boot 2.6.2 (gh-512)
2 parents ae5fa0f + 5328664 commit 64227d7

File tree

4 files changed

+104
-1
lines changed

4 files changed

+104
-1
lines changed

config/src/main/java/com/ubaid/ms/config/ConfigServer.java

+47
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,18 @@
11
package com.ubaid.ms.config;
22

3+
import java.lang.reflect.Field;
4+
import java.util.List;
5+
import org.springframework.beans.BeansException;
6+
import org.springframework.beans.factory.config.BeanPostProcessor;
37
import org.springframework.boot.SpringApplication;
48
import org.springframework.boot.autoconfigure.SpringBootApplication;
59
import org.springframework.cloud.config.server.EnableConfigServer;
10+
import org.springframework.context.annotation.Bean;
11+
import org.springframework.lang.NonNull;
12+
import org.springframework.util.ReflectionUtils;
13+
import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
14+
import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider;
15+
import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;
616

717
@EnableConfigServer
818
@SpringBootApplication
@@ -12,4 +22,41 @@ public static void main(String[] args) {
1222
SpringApplication.run(ConfigServer.class, args);
1323
}
1424

25+
@Bean
26+
public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
27+
return new BeanPostProcessor() {
28+
29+
@Override
30+
public Object postProcessAfterInitialization(@NonNull Object bean, @NonNull String beanName) throws BeansException {
31+
if (bean instanceof WebMvcRequestHandlerProvider
32+
|| bean instanceof WebFluxRequestHandlerProvider) {
33+
customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
34+
}
35+
return bean;
36+
}
37+
38+
private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(
39+
List<T> mappings) {
40+
List<T> copy = mappings.stream()
41+
.filter(mapping -> mapping.getPatternParser() == null)
42+
.toList();
43+
mappings.clear();
44+
mappings.addAll(copy);
45+
}
46+
47+
@SuppressWarnings("unchecked")
48+
private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
49+
try {
50+
Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
51+
assert field != null;
52+
field.setAccessible(true);
53+
return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
54+
} catch (IllegalArgumentException | IllegalAccessException e) {
55+
throw new IllegalStateException(e);
56+
}
57+
}
58+
};
59+
}
60+
61+
1562
}

config/src/main/resources/application.yml

+6-1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,10 @@ spring:
33
name: spring-cloud-config-server
44
profiles:
55
active: @activatedProperties@
6+
mvc:
7+
pathmatch:
8+
matching-strategy: ant_path_matcher
9+
main:
10+
allow-bean-definition-overriding: true
611
server:
7-
port: 8888
12+
port: 8888
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,59 @@
11
package com.ubaid.ms.discovery;
22

3+
import java.lang.reflect.Field;
4+
import java.util.List;
5+
import org.springframework.beans.BeansException;
6+
import org.springframework.beans.factory.config.BeanPostProcessor;
37
import org.springframework.boot.SpringApplication;
48
import org.springframework.boot.autoconfigure.SpringBootApplication;
59
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
10+
import org.springframework.context.annotation.Bean;
11+
import org.springframework.lang.NonNull;
12+
import org.springframework.util.ReflectionUtils;
13+
import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
14+
import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider;
15+
import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;
616

717
@SpringBootApplication
818
@EnableEurekaServer
919
public class DiscoveryApp {
1020

1121
public static void main(String[] args) { SpringApplication.run(DiscoveryApp.class, args); }
22+
23+
@Bean
24+
public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
25+
return new BeanPostProcessor() {
26+
27+
@Override
28+
public Object postProcessAfterInitialization(@NonNull Object bean, @NonNull String beanName) throws BeansException {
29+
if (bean instanceof WebMvcRequestHandlerProvider
30+
|| bean instanceof WebFluxRequestHandlerProvider) {
31+
customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
32+
}
33+
return bean;
34+
}
35+
36+
private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(
37+
List<T> mappings) {
38+
List<T> copy = mappings.stream()
39+
.filter(mapping -> mapping.getPatternParser() == null)
40+
.toList();
41+
mappings.clear();
42+
mappings.addAll(copy);
43+
}
44+
45+
@SuppressWarnings("unchecked")
46+
private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
47+
try {
48+
Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
49+
assert field != null;
50+
field.setAccessible(true);
51+
return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
52+
} catch (IllegalArgumentException | IllegalAccessException e) {
53+
throw new IllegalStateException(e);
54+
}
55+
}
56+
};
57+
}
58+
1259
}

discovery/src/main/resources/application.properties

+4
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,7 @@ eureka.instance.prefer-ip-address=true
1111
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
1212
eureka.instance.hostname=${spring.cloud.client.ip-address}
1313

14+
15+
#----------------------------Disabling warnings ------#
16+
spring.mvc.pathmatch.matching-strategy=ant_path_matcher
17+
spring.main.allow-circular-references=true

0 commit comments

Comments
 (0)