我正在使用Spring 5的功能,我在注册RouterFunction
时遇到了一些问题,它将被读取,但不会被映射。 (通过在方法中抛出异常来尝试。)
@Configuration
@RequestMapping("/routes")
public class Routes {
@Bean
public RouterFunction<ServerResponse> routingFunction() {
return RouterFunctions.route(RequestPredicates.path("/asd"), req -> ok().build());
}
}
转到/routes/asd
结果是404,有关我做错的任何线索?
(我也试过没有这个@RequestMapping
到/routes
,它也为/asd
返回了404
答案 0 :(得分:5)
我发现了这个问题。
我的pom.xml中有这些依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
删除了spring-boot-starter-web依赖项,并且webflux开始正常工作。
另一种解决方案是保持Web依赖性并排除tomcat,以便netty开始工作:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
答案 1 :(得分:2)
当您想要使用Webflux时,无需添加spring-boot-starter-web
,只需将spring-boot-starter-webflux
添加到项目依赖项中即可。
对于您的代码,如果您想使用纯@RequestMapping("/routes")
,请移除RouterFunction
。并且您的routingFunction
bean没有指定将使用哪种HTTP方法。
来自我的github的工作示例代码:
@Bean
public RouterFunction<ServerResponse> routes(PostHandler postController) {
return route(GET("/posts"), postController::all)
.andRoute(POST("/posts"), postController::create)
.andRoute(GET("/posts/{id}"), postController::get)
.andRoute(PUT("/posts/{id}"), postController::update)
.andRoute(DELETE("/posts/{id}"), postController::delete);
}
查看完整代码:https://github.com/hantsy/spring-reactive-sample/tree/master/boot-routes
如果您坚持传统的@RestController
和@RequestMapping
,请查看另一个示例:https://github.com/hantsy/spring-reactive-sample/tree/master/boot