gpt4 book ai didi

spring - 如何使用 Spring WebFlux 返回 404

转载 作者:行者123 更新时间:2023-12-03 17:46:07 26 4
gpt4 key购买 nike

我有一个这样的 Controller (在 Kotlin 中):

@RestController
@RequestMapping("/")
class CustomerController (private val service: CustomerService) {
@GetMapping("/{id}")
fun findById(@PathVariable id: String,
@RequestHeader(value = IF_NONE_MATCH) versionHeader: String?): Mono<HttpEntity<KundeResource>> =
return service.findById(id)
.switchIfEmpty(Mono.error(NotFoundException()))
.map {
// ETag stuff ...
ok().eTag("...").body(...)
}
}

我想知道是否有比抛出用 @ResponseStatus(code = NOT_FOUND) 注释的异常更好的方法

最佳答案

我想使用 RouteFunction当 Spring 5 稳定时,而不是 @RestController。定义一个HandlerFunction来处理请求,然后声明一个RouteFunction将请求映射到 HandlerFunction:

public Mono<ServerResponse> get(ServerRequest req) {
return this.posts
.findById(req.pathVariable("id"))
.flatMap((post) -> ServerResponse.ok().body(Mono.just(post), Post.class))
.switchIfEmpty(ServerResponse.notFound().build());
}

查看完整的示例代码 here .

Kotlin 版本,定义了一个处理请求的函数,使用 RouteFunctionDSL将传入请求映射到 HandlerFuncation:
fun get(req: ServerRequest): Mono<ServerResponse> {
return this.posts.findById(req.pathVariable("id"))
.flatMap { post -> ok().body(Mono.just(post), Post::class.java) }
.switchIfEmpty(notFound().build())
}

它可以是一个表达式,例如:
fun get(req: ServerRequest): Mono<ServerResponse> = this.posts.findById(req.pathVariable("id"))
.flatMap { post -> ok().body(Mono.just(post), Post::class.java) }
.switchIfEmpty(notFound().build())

查看 Kotlin DSL 的完整示例代码 here .

如果您更喜欢传统 Controller 来公开 REST API,请尝试这种方法。

首先定义一个异常,例如。 PostNotFoundException .然后把它扔到 Controller 中。
 @GetMapping(value = "/{id}")
public Mono<Post> get(@PathVariable(value = "id") Long id) {
return this.posts.findById(id).switchIfEmpty(Mono.error(new PostNotFoundException(id)));
}

定义一个 ExceptionHandler处理异常,并将其注册到 HttpHandler .
@Profile("default")
@Bean
public NettyContext nettyContext(ApplicationContext context) {
HttpHandler handler = WebHttpHandlerBuilder.applicationContext(context)
.exceptionHandler(exceptionHandler())
.build();
ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(handler);
HttpServer httpServer = HttpServer.create("localhost", this.port);
return httpServer.newHandler(adapter).block();
}

@Bean
public WebExceptionHandler exceptionHandler() {
return (ServerWebExchange exchange, Throwable ex) -> {
if (ex instanceof PostNotFoundException) {
exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND);
return exchange.getResponse().setComplete();
}
return Mono.error(ex);
};
}

检查 complete codes这里。对于 Spring Boot 用户,请检查 this sample .

更新 :在最新的spring 5.2中,发现了一般 @RestControllerAdvice适用于 webflux 应用程序中的 Controller 。

关于spring - 如何使用 Spring WebFlux 返回 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45752104/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com