首页 > 解决方案 > 弹簧 WebFlux。控制器调用后如何添加特定逻辑?

问题描述

我有下一个RestController

@PostMapping("/play")
public Mono<PlayResponse> play(@RequestBody String body) {
    //business logic here;
}

我想在控制器调用之后添加一些额外的逻辑。例如,我想向我的应用程序添加一些modes逻辑:

我试图通过以下方式实现这一目标WebFilter

@Component
public class OutgoingFilter implements WebFilter {

    Mode mode = new TimeoutMode();

    @NonNull
    @Override
    public Mono<Void> filter(@NonNull final ServerWebExchange exchange, final WebFilterChain chain) {
        return chain.filter(exchange)
                .doOnNext(this::onNext)
                .map(this::onMap)
                .doFinally(this::onFinally);
    }

    private Void onMap(final Void unused) {
        mode.run();
        return unused;
    }

    private void onNext(final Void unused) {
        mode.run();
    }

    private void onFinally(final SignalType signalType) {
        mode.run();
    }

}

如您所见,我已经尝试过onMapdoOnNext并且onFinally方法似乎都不起作用。

在那里使用正确WebFilter吗?也许我做错了什么?如何在Spring WebFlux应用程序中实现这样的逻辑?


更新

有我的Mode界面:

public interface Mode {
    void run() throws Forbidden;
}

实现:

public class Fail implements Mode {
    @Override
    public void run() throws Forbidden {
        throw new Forbidden("Fail mode enabled");
    }
}
public class Wait implements Mode {

    private final int ms;

    public Wait() {
        this(0);
    }

    public Wait(final int ms) {
        this.ms = ms;
    }

    @Override
    public void run() throws Forbidden {
        sleep();
    }

    private void sleep() {
        try {
            Thread.sleep(ms);
        } catch (InterruptedException e) {
            throw new IllegalStateException(e);
        }
    }
}

但实施并不是最终的。reactive如果需要,我会将它们更改为样式。

标签: javaspringspring-webflux

解决方案


推荐阅读