简体   繁体   English

Spring WebFlux-无法在HandlerAdapter中返回HTTP响应

[英]Spring WebFlux - Unable to return HTTP response in HandlerAdapter

I'm trying to recreate HttpServletResponse#getWriter functionality in Spring WebFlux without success. 我试图在Spring WebFlux中重新创建HttpServletResponse#getWriter功能,但没有成功。

In Spring MVC, I would extend HandlerInterceptorAdapter , use mentioned getWriter for writing target response and return false from preHandle method. 在Spring MVC中,我将扩展HandlerInterceptorAdapter ,使用提到的getWriter编写目标响应,并从preHandle方法返回false。 I'm trying to use the following code to recreate the same functionality. 我正在尝试使用以下代码重新创建相同的功能。 See following excerpts to see what I've tried so far without success. 请参阅以下摘录,以了解到目前为止我尝试过的没有成功的内容。

@Component
public class CustomInterceptor extends RequestMappingHandlerAdapter
    @Override
    public Mono<HandlerResult> handle(ServerWebExchange exchange, Object handler) {
        exchange.getResponse().writeWith(s -> Mono.just(new SomeDto()));
        // creates Internal Server Error, custom WebExceptionHandler not called
        return Mono.error(new RuntimeException());
        // creates Internal Server Error, custom WebExceptionHandler not called
        throw new RuntimeException();
        // ignores response write
        return super.handle(exchange, handler);
    }
}

I've also tried to use a WebFilter , there is a possibility to change the response, however it's not possible to access HandlerMethod object, which is needed for further processing. 我也尝试过使用WebFilter ,可以更改响应,但是无法访问HandlerMethod对象,这是进一步处理所必需的。

Any idea how to do this using Spring WebFlux? 知道如何使用Spring WebFlux做到这一点吗? All ideas are welcome. 欢迎所有想法。 Thank you. 谢谢。

It is possible to handle the request/response in the new reactive WebFilter , eg. 可以在新的反应式WebFilter处理请求/响应,例如。

@Component
public class SecurityWebFilter implements WebFilter{
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        if(!exchange.getRequest().getQueryParams().containsKey("user")){
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        }
        return chain.filter(exchange);
    }
}

Check my complete webfilter sample . 检查我完整的webfilter示例

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM