Mono里是不支持注解事务的。
比如
@Transactional
public Mono<CommonOutput> save(RecordFileSaveReq req) {
return Mono.just(true)
.filter(b -> saveLog(req))
.filter(b -> copyFile(req))
.filter(b -> removeTempFile(req))
.map(b -> success());
}
这样是不行的。
只能回到老办法:
@Transactional
public CommonOutput logProcess(RecordFileSaveReq req) {
//保存日志
repository.save(req);
String name = storeService.generateName();
//转储
storeService.copyFile(req.getVoiceAddress(), "");
//删除临时文件
removeTempFile(req);
return success();
}
其中,repository.save方法和storeService.copyFile方法都会抛运行时异常。
Controller里的方法就会很罗嗦,要截获异常:
@PostMapping(name = "/recordFile/save")
@ResponseBody
public Mono<CommonOutput> save(@Valid @RequestBody Mono<RecordFileSaveReq> req) {
return Mono.create(sink ->
req.doOnError(WebExchangeBindException.class, throwable ->
sink.success(fail(throwable))
).doOnNext(r -> Mono.just(true)
.map(b -> service.logProcess(r))
.onErrorReturn(RecordObjectException.class, recordObjError())
.onErrorReturn(SessionIDTypeException.class, sessionAndTypeError())
.onErrorReturn(DataAccessException.class, otherError())
.onErrorRet