Spring Cloud Gateway Server MVC-我们可以将Spring mvc与Spring Cloud Gateway一起使用吗

qacovj5a  于 2024-01-05  发布在  Spring
关注(0)|答案(4)|浏览(256)

Spring Cloud Gateway Server MVC的目的是什么?它可以用在Spring Cloud Gateway Reactive的地方吗?如果可以,有人能提供更好的例子吗?这里是我想要的文档
https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway-server-mvc.html
我试图让它工作,但不明白是什么问题。这是我的配置。

  1. import static org.springframework.security.config.Customizer.withDefaults;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  5. import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
  6. import org.springframework.security.config.http.SessionCreationPolicy;
  7. import org.springframework.security.web.SecurityFilterChain;
  8. import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
  9. @Configuration
  10. @EnableWebSecurity
  11. public class SecurityConfig {
  12. @Bean
  13. public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
  14. http.authorizeHttpRequests(exchanges->exchanges.requestMatchers("/oauth/**","/login/**").permitAll())
  15. .authorizeHttpRequests(https->https.anyRequest().authenticated())
  16. .oauth2Login(withDefaults());
  17. return http.build();
  18. }
  19. }

字符串
这是我的YML文件

  1. spring:
  2. cloud:
  3. gateway:
  4. mvc:
  5. routes:
  6. - id: service1
  7. uri: http://localhost:8081/
  8. predicates:
  9. - Path=/api/**
  10. security:
  11. oauth2:
  12. client:
  13. registration:
  14. azure:
  15. client-id: dummy737373737373
  16. client-secret: dummypassword737373737373
  17. authorization-grant-type: authorization_code
  18. redirect-uri: '{baseUrl}/login/oauth2/code/{registrationId}'
  19. scope: User.Read
  20. provider:
  21. azure:
  22. authorization-uri: https://login.microsoftonline.com/dummypasswordtenantid/oauth2/v2.0/authorize
  23. token-uri: https://login.microsoftonline.com/dummypasswordtenantid/oauth2/v2.0/token
  24. user-info-uri: https://graph.microsoft.com/oidc/userinfo
  25. jwk-set-uri: https://login.microsoftonline.com/dummypasswordtenantid/discovery/v2.0/keys
  26. user-name-attribute: name


服务器:端口:9000
这是我的pom

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>3.2.0</version>
  9. <relativePath /> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>swiss</groupId>
  12. <artifactId>manoj-gateway</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>manoj-gateway</name>
  15. <description>manoj-gateway</description>
  16. <properties>
  17. <java.version>17</java.version>
  18. <spring-cloud.version>2023.0.0-RC1</spring-cloud.version>
  19. </properties>
  20. <dependencies>
  21. <!--<dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-gateway-server-mvc</artifactId>
  24. </dependency>-->
  25. <!-- <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-oauth2-client</artifactId>
  28. </dependency>-->
  29. <!--
  30. https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-gateway-mvc -->
  31. <dependency>
  32. <groupId>org.springframework.cloud</groupId>
  33. <artifactId>spring-cloud-starter-gateway-mvc</artifactId>
  34. </dependency>
  35. <!--
  36. https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
  37. <dependency>
  38. <groupId>org.springframework.boot</groupId>
  39. <artifactId>spring-boot-starter-web</artifactId>
  40. </dependency>
  41. <dependency>
  42. <groupId>org.springframework.cloud</groupId>
  43. <artifactId>spring-cloud-starter</artifactId>
  44. </dependency>
  45. <!-- <dependency>
  46. <groupId>org.springframework.cloud</groupId>
  47. <artifactId>spring-cloud-gateway-server</artifactId>
  48. </dependency>
  49. -->
  50. <!--
  51. https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-loadbalancer -->
  52. <dependency>
  53. <groupId>org.springframework.cloud</groupId>
  54. <artifactId>spring-cloud-starter-loadbalancer</artifactId>
  55. </dependency>
  56. <dependency>
  57. <groupId>org.springframework.boot</groupId>
  58. <artifactId>spring-boot-starter-test</artifactId>
  59. <scope>test</scope>
  60. </dependency>
  61. </dependencies>
  62. <dependencyManagement>
  63. <dependencies>
  64. <dependency>
  65. <groupId>org.springframework.cloud</groupId>
  66. <artifactId>spring-cloud-dependencies</artifactId>
  67. <version>${spring-cloud.version}</version>
  68. <type>pom</type>
  69. <scope>import</scope>
  70. </dependency>
  71. </dependencies>
  72. </dependencyManagement>
  73. <build>
  74. <plugins>
  75. <plugin>
  76. <groupId>org.springframework.boot</groupId>
  77. <artifactId>spring-boot-maven-plugin</artifactId>
  78. </plugin>
  79. </plugins>
  80. </build>
  81. <repositories>
  82. <repository>
  83. <id>spring-milestones</id>
  84. <name>Spring Milestones</name>
  85. <url>https://repo.spring.io/milestone</url>
  86. <snapshots>
  87. <enabled>false</enabled>
  88. </snapshots>
  89. </repository>
  90. </repositories>
  91. </project>


我有一个更多的Spring Boot 服务8081上运行.我需要重定向到该服务,但它不工作.有人能解释我需要改变什么.感谢帮助,我已经作出了改变,建议,但我得到以下错误,也删除了Spring的安全只是为了检查路线是否正常工作.

  1. java.lang.AbstractMethodError: Receiver class org.springframework.cloud.gateway.server.mvc.handler.RestClientProxyExchange$$Lambda$906/0x000000080060f988 does not define or inherit an implementation of the resolved method 'abstract java.lang.Object exchange(org.springframework.http.HttpRequest, org.springframework.web.client.RestClient$RequestHeadersSpec$ConvertibleClientHttpResponse)' of interface org.springframework.web.client.RestClient$RequestHeadersSpec$ExchangeFunction.
  2. at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:456) ~[spring-web-6.1.1.jar:6.1.1]
  3. at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:429) ~[spring-web-6.1.1.jar:6.1.1]
  4. at org.springframework.cloud.gateway.server.mvc.handler.RestClientProxyExchange.exchange(RestClientProxyExchange.java:40) ~[spring-cloud-gateway-server-mvc-4.1.0-RC1.jar:4.1.0-RC1]
  5. at org.springframework.cloud.gateway.server.mvc.handler.ProxyExchangeHandlerFunction.handle(ProxyExchangeHandlerFunction.java:106) ~[spring-cloud-gateway-server-mvc-4.1.0-RC1.jar:4.1.0-RC1]
  6. at org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions$LookupProxyExchangeHandlerFunction.handle(HandlerFunctions.java:94) ~[spring-cloud-gateway-server-mvc-4.1.0-RC1.jar:4.1.0-RC1]
  7. at org.springframework.web.servlet.function.HandlerFilterFunction.lambda$ofRequestProcessor$3(HandlerFilterFunction.java:83) ~[spring-webmvc-6.1.1.jar:6.1.1]
  8. at org.springframework.web.servlet.function.HandlerFilterFunction.lambda$andThen$0(HandlerFilterFunction.java:58) ~[spring-webmvc-6.1.1.jar:6.1.1]
  9. at org.springframework.cloud.gateway.server.mvc.config.GatewayMvcPropertiesBeanDefinitionRegistrar.lambda$getRouterFunction$3(GatewayMvcPropertiesBeanDefinitionRegistrar.java:172) ~[spring-cloud-gateway-server-mvc-4.1.0-RC1.jar:4.1.0-RC1]
  10. at org.springframework.web.servlet.function.HandlerFilterFunction.lambda$andThen$0(HandlerFilterFunction.java:58) ~[spring-webmvc-6.1.1.jar:6.1.1]
  11. at org.springframework.web.servlet.function.HandlerFilterFunction.lambda$ofRequestProcessor$3(HandlerFilterFunction.java:83) ~[spring-webmvc-6.1.1.jar:6.1.1]
  12. at org.springframework.web.servlet.function.HandlerFilterFunction.lambda$andThen$1(HandlerFilterFunction.java:59) ~[spring-webmvc-6.1.1.jar:6.1.1]
  13. at org.springframework.web.servlet.function.HandlerFilterFunction.lambda$andThen$1(HandlerFilterFunction.java:59) ~[spring-webmvc-6.1.1.jar:6.1.1]
  14. at org.springframework.web.servlet.function.HandlerFilterFunction.lambda$apply$2(HandlerFilterFunction.java:70) ~[spring-webmvc-6.1.1.jar:6.1.1]
  15. at org.springframework.web.servlet.function.support.HandlerFunctionAdapter.handle(HandlerFunctionAdapter.java:107) ~[spring-webmvc-6.1.1.jar:6.1.1]
  16. at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.1.1.jar:6.1.1]
  17. at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.1.1.jar:6.1.1]
  18. at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.1.1.jar:6.1.1]
  19. at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.1.1.jar:6.1.1]
  20. at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.16.jar:6.0]
  21. at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.1.1.jar:6.1.1]
  22. at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.16.jar:6.0]
  23. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  24. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  25. at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.16.jar:10.1.16]
  26. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  27. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  28. at org.springframework.cloud.gateway.server.mvc.filter.WeightCalculatorFilter.doFilter(WeightCalculatorFilter.java:229) ~[spring-cloud-gateway-server-mvc-4.1.0-RC1.jar:4.1.0-RC1]
  29. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  30. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  31. at org.springframework.cloud.gateway.server.mvc.filter.FormFilter.doFilter(FormFilter.java:97) ~[spring-cloud-gateway-server-mvc-4.1.0-RC1.jar:4.1.0-RC1]
  32. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  33. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  34. at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.1.1.jar:6.1.1]
  35. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.1.jar:6.1.1]
  36. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  37. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  38. at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.1.1.jar:6.1.1]
  39. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.1.jar:6.1.1]
  40. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  41. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  42. at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.1.1.jar:6.1.1]
  43. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.1.jar:6.1.1]
  44. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  45. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  46. at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  47. at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  48. at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  49. at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  50. at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  51. at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  52. at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:340) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  53. at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  54. at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  55. at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  56. at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  57. at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  58. at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  59. at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  60. at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
  61. at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]

pgx2nnw8

pgx2nnw81#

是的,Spring云网关MVC是Spring云网关Reactive的替代品。它们非常相似,它们之间的区别来自它们使用的方法和类-例如Spring云网关Reactive使用React式方法,因此类如MonoFluxServerWebExchangeGatewayFilterFactoryRouteLocator仅举几例,而Spring云网关MVC使用RouterFunction等类来定义路由,相当于RouteLocator
下面是一个使用spring cloud gateway MVC和Reactive定义路由 predicate 和过滤器的例子。下面的例子实现了一个路由,它只会在经过一定时间后接受请求,然后通过添加请求头X-Trace-Token来修改请求:

使用Spring Cloud网关的示例

  1. @Bean
  2. public RouteLocator routeConfig(RouteLocatorBuilder builder) {
  3. return builder.routes()
  4. .route(p -> p.path("/accounts").and().after(ZonedDateTime.parse("2023-12-06T19:03:47.789-05:00[America/New_York]")))
  5. .filters(f -> f.addRequestHeader("X-Trace-Token", "cd855f1a-0df3-4199-bc33-821dc797fc29")
  6. .uri("http://example.com"))
  7. .build();
  8. }

字符串
`使用Spring Cloud网关MVC的示例

  1. @Bean
  2. public RouterFunction<ServerResponse> routeConfig() {
  3. return route("route_id")
  4. .route(after(ZonedDateTime.parse("2023-12-06T19:03:47.789-05:00[America/New_York]")), GET("/accounts"), http("http://example.com"))
  5. .after(addRequestHeader("X-Trace-Token", "cd855f1a-0df3-4199-bc33-821dc797fc29"))
  6. .build();
  7. }


Spring Cloud Gateway MVC和Reactive的完整文档可以在上面描述的链接中找到。

已编辑

定义的网关路由配置应该可以正常工作。一些可能的修复方法包括:
1。在yaml配置中定义网关服务器端口,例如。

  1. server:
  2. port: 9000


然后使用网关服务器端口向端口8081上的服务发出请求,例如:
http://localhost:9000/api/some_path
将被重定向到端口8081上的服务。
2。要定义网关路由,请使用spring.cloud.gateway.mvc.routes,因为您使用的是spring cloud gateway mvc。
3.该错误可能是由您在spring安全配置中定义的安全策略导致的,因此阻止了网关服务器重定向到服务,如果可能的话,请尝试在禁用spring安全策略的同时测试网关路由,以确定是否存在此问题。

展开查看全部
mnowg1ta

mnowg1ta2#

请注意,Spring Cloud Gateway与Spring MVC(spring-boot-starter-web)不兼容。这在官方参考文档中的如何包含Spring Cloud Gateway中有详细说明
正如错误消息所建议的,您需要删除对spring-boot-starter-web的依赖。您可以使用以下命令列出所有直接和传递依赖:

  1. mvn dependency:tree

字符串
这将揭示spring-cloud-starter依赖于spring-boot-starter-web。一旦从pom.xml中删除以下行,您的应用程序应该启动:

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter</artifactId>
  4. </dependency>


请注意,spring-cloud-gatewayspring-boot-starter-web不兼容
另一个可能的解决方案是更改application.properties文件:

  1. spring.main.web-application-type=reactive


您可以查看此stackoverflow帖子以获取更多信息:
Spring Cloud Gateway; Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway Issue

编辑:

在错误之后,它似乎与一个名为ProxyExchange的实用程序对象有关:
Spring Cloud Gateway提供了一个名为ProxyExchange的实用程序对象。您可以在常规Spring Web处理程序中使用它作为方法参数。它通过镜像HTTP动词的方法支持基本的下游HTTP交换。使用MVC,它还支持通过forward()方法转发到本地处理程序。要使用ProxyExchange,在classpath中包含正确的模块(spring-cloud-gateway-mvc或spring-cloud-gateway-webflux)。
下面的MVC示例将请求代理到/test下游的远程服务器:

  1. @RestController
  2. @SpringBootApplication
  3. public class GatewaySampleApplication {
  4. @Value("${remote.home}")
  5. private URI home;
  6. @GetMapping("/test")
  7. public ResponseEntity<?> proxy(ProxyExchange<byte[]> proxy) throws Exception {
  8. return proxy.uri(home.toString() + "/image/png").get();
  9. }
  10. }


下面的例子对Webflux做了同样的事情:

  1. @RestController
  2. @SpringBootApplication
  3. public class GatewaySampleApplication {
  4. @Value("${remote.home}")
  5. private URI home;
  6. @GetMapping("/test")
  7. public Mono<ResponseEntity<?>> proxy(ProxyExchange<byte[]> proxy) throws Exception {
  8. return proxy.uri(home.toString() + "/image/png").get();
  9. }
  10. }


ProxyExchange上的便利方法使处理程序方法能够发现和增强传入请求的URI路径。例如,您可能希望提取路径的尾随元素以将其传递到下游:

  1. @GetMapping("/proxy/path/**")
  2. public ResponseEntity<?> proxyPath(ProxyExchange<byte[]> proxy) throws Exception {
  3. String path = proxy.path("/proxy/path/");
  4. return proxy.uri(home.toString() + "/foos/" + path).get();
  5. }


您可以扩展更多细节here

展开查看全部
imzjd6km

imzjd6km3#

我自己的理解
最近我也一直在使用SpringCloudGateway开发我们自己的网关产品,根据我对这份官方文档的了解,具体如下:
SpringCloudGateway默认的底层依赖是Spring Webflux,我们知道Spring Webflux是异步响应式编程,编程范型是使用流范型编写的;
那么SpringCloudGateway是否支持同步网关呢?官方是支持的,官网提供了相应的解决方案,就是将默认的底层Webflux切换到SpringMVC来支持同步;
相当于SpringCloudGateway提供了网关路由的两个底层实现,一个是对应Spring Webflux的异步,另一个是对应Spring MVC的同步。

示例:

1 pom.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.winning.gate</groupId>
  7. <artifactId>mvc-gateway</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <properties>
  10. <maven.compiler.source>17</maven.compiler.source>
  11. <maven.compiler.target>17</maven.compiler.target>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. </properties>
  14. <dependencyManagement>
  15. <dependencies>
  16. <dependency>
  17. <groupId>org.springframework.cloud</groupId>
  18. <artifactId>spring-cloud-dependencies</artifactId>
  19. <version>2023.0.0</version>
  20. <type>pom</type>
  21. <scope>import</scope>
  22. </dependency>
  23. </dependencies>
  24. </dependencyManagement>
  25. <dependencies>
  26. <dependency>
  27. <groupId>org.springframework.cloud</groupId>
  28. <artifactId>spring-cloud-starter-gateway-mvc</artifactId>
  29. </dependency>
  30. </dependencies>
  31. </project>

字符串

2 application.yml:

  1. server:
  2. port: 9098

3 com.demo.GatewaySampleApplication:

  1. package com.demo;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. /**
  5. * @author xch
  6. * 2023/12/15 16:56
  7. */
  8. @SpringBootApplication
  9. public class GatewaySampleApplication {
  10. public static void main(String[] args) {
  11. SpringApplication.run(GatewaySampleApplication.class, args);
  12. }
  13. }

4 com.demo.SimpleGateway

  1. package com.demo;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.web.servlet.function.RouterFunction;
  5. import org.springframework.web.servlet.function.ServerResponse;
  6. import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
  7. import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
  8. /**
  9. * @author xch
  10. * 2023/12/15 16:52
  11. */
  12. @Configuration
  13. class SimpleGateway {
  14. @Bean
  15. public RouterFunction<ServerResponse> getRoute() {
  16. return route().GET("/demo", http("http://localhost:8080/")).build();
  17. }
  18. }


上面是所有的代码

5请求结果

  1. GET http://localhost:9098/demo?ceshi=ceshi
  2. HTTP/1.1 200
  3. date: Fri, 15 Dec 2023 09:23:37 GMT
  4. Content-Type: application/json
  5. Transfer-Encoding: chunked
  6. Keep-Alive: timeout=60
  7. Connection: keep-alive
  8. {
  9. "code": 0,
  10. "data": "ceshi"
  11. }
  12. Response file saved.
  13. > 2023-12-15T172337.200.json
  14. Response code: 200; Time: 19ms (19 ms); Content length: 25 bytes (25 B)


路由的目的服务地址在SimpleGateway中,您可以将其更改为自己的服务

展开查看全部
kfgdxczn

kfgdxczn4#

我运行了你提供的code,得到了同样的错误:

  1. 2023-12-16T16:07:30.395+08:00 ERROR 40097 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed: java.lang.AbstractMethodError: Receiver class org.springframework.cloud.gateway.server.mvc.handler.RestClientProxyExchange$$Lambda$942/0x000000080114bf28 does not define or inherit an implementation of the resolved method 'abstract java.lang.Object exchange(org.springframework.http.HttpRequest, org.springframework.web.client.RestClient$RequestHeadersSpec$ConvertibleClientHttpResponse)' of interface org.springframework.web.client.RestClient$RequestHeadersSpec$ExchangeFunction.] with root cause

字符串
根据错误消息,变量exchangeFunction不是实现方法abstract java.lang.Object exchange(org.springframework.http.HttpRequest, org.springframework.web.client.RestClient$RequestHeadersSpec$ConvertibleClientHttpResponse)

lambda实现方法无法覆盖接口方法。通常,应该只有一个这样的方法:public java.lang.Object org.springframework.cloud.gateway.server.mvc.handler.RestClientProxyExchange$$Lambda$942/0x000000080114bf28.exchange(org.springframework.http.HttpRequest,org.springframework.web.client.RestClient$RequestHeadersSpec$ConvertibleClientHttpResponse)
变量exchangeFunctionRestClientProxyExchange中声明:

exchange方法的字节码如下:

你可以通过重新定义类型来解决这个问题,从Spring的源代码中复制RestClientProxyExchange并在你的项目中定义它:

为什么会这样?我用的是同一个源代码,只能编译正确的结果而不能编译错误的结果:

也许只有Spring知道原因。

展开查看全部

相关问题