java - 弹簧 WebFlux。控制器调用后如何添加特定逻辑?
问题描述
我有下一个RestController
:
@PostMapping("/play")
public Mono<PlayResponse> play(@RequestBody String body) {
//business logic here;
}
我想在控制器调用之后添加一些额外的逻辑。例如,我想向我的应用程序添加一些modes
逻辑:
timeout mode
- 成功调用后,响应将等待直到发生超时long answer mode
- 成功调用后,响应将等待特定数量的 msfailure mode
- 成功调用后,响应将以FORBIDDEN
代码回答- 等等
我试图通过以下方式实现这一目标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();
}
}
如您所见,我已经尝试过onMap
,doOnNext
并且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
如果需要,我会将它们更改为样式。
解决方案
推荐阅读
- assembly - gcc 高效字节复制 ARM Cortex M4
- ios - iOS - Firestore 复合索引中的索引上的多个 orderBy 和 where 子句
- ios - 如何在导航栏标题中调整图像大小
- iis - ERR_CONNECTION_RESET 本地 IIS 网站 odata 错误
- django - Django:找不到''的反向。'' 不是有效的视图函数或模式名称
- google-assistant-sdk - Webhook 和帖子上的 Google IOT 设备
- django - Django消息,计算两个用户之间的消息数
- java - 创建返回字符串中重复字符的函数
- javascript - 将视频流 javascript 代码传输到 React (ML5)
- javascript - 如何在表格中自动添加信息