Siéntete libre de divulgar nuestro sitio y códigos en tus redes sociales, danos de tu ayuda para ampliar esta comunidad.
Solución:
me gustaria usar RouteFunction
en lugar de @RestController cuando Spring 5 es estable. Defina un HandlerFunction para manejar la solicitud y luego declare un RouteFunction
para asignar la solicitud a HandlerFunction:
public Mono get(ServerRequest req)
return this.posts
.findById(req.pathVariable("id"))
.flatMap((post) -> ServerResponse.ok().body(Mono.just(post), Post.class))
.switchIfEmpty(ServerResponse.notFound().build());
Consulte los códigos de ejemplo completos aquí.
Versión de Kotlin, defina una función para manejar la solicitud, el uso RouteFunctionDSL
para asignar la solicitud entrante a HandlerFuncation:
fun get(req: ServerRequest): Mono
return this.posts.findById(req.pathVariable("id"))
.flatMap post -> ok().body(Mono.just(post), Post::class.java)
.switchIfEmpty(notFound().build())
Puede ser una expresión, como:
fun get(req: ServerRequest): Mono = this.posts.findById(req.pathVariable("id"))
.flatMap post -> ok().body(Mono.just(post), Post::class.java)
.switchIfEmpty(notFound().build())
Consulta los códigos de ejemplo completos de Kotlin DSL aquí.
Si prefiere que los controladores tradicionales expongan las API REST, pruebe este enfoque.
En primer lugar, defina una excepción, p. PostNotFoundException
. Luego tíralo en el controlador.
@GetMapping(value = "/id")
public Mono get(@PathVariable(value = "id") Long id)
return this.posts.findById(id).switchIfEmpty(Mono.error(new PostNotFoundException(id)));
Definir un ExceptionHandler
para manejar la excepción y registrarla en 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);
;
Consulta los códigos completos aquí. Para los usuarios de Spring Boot, consulte este ejemplo.
Actualizar:En la última primavera 5.2, encontré el general @RestControllerAdvice
funciona para controladores en aplicaciones webflux.
Puede usar ResponseStatusException, simplemente extienda su excepción:
public class YourLogicException extends ResponseStatusException {
public YourLogicException(String message)
super(HttpStatus.NOT_FOUND, message);
public YourLogicException(String message, Throwable cause)
super(HttpStatus.NOT_FOUND, message, cause);
Y en servicio:
public Mono doLogic(Mono ctx)
return ctx.map(ctx -> doSomething(ctx));
private String doSomething(YourContext ctx)
try
// some logic
catch (Exception e)
throw new YourLogicException("Exception message", e);
Y después de eso, podrías tener un bonito mensaje:
"timestamp": 00000000, "path": "/endpoint", "status": 404, "error": "Not found", "message": "Exception message"
En lugar de lanzar una excepción, la implementación del método se puede cambiar a
fun findById(@PathVariable id: String,
@RequestHeader(value = IF_NONE_MATCH) versionHeader: String?): Mono> =
return service.findById(id)
.map
// ETag stuff ...
ok().eTag("...").body(...)
.defaultIfEmpty(notFound().build())
valoraciones y comentarios
Acuérdate de que tienes la opción de valorar esta noticia si te fue preciso.