Saltar al contenido

Cómo devolver 404 con Spring WebFlux

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *