Java 返回Mono Void时出现404错误
我正在使用SpringWebFlux创建一个用于学习的web应用程序,我有一个函数,它首先检查记录是否存在,然后更新记录,否则抛出自定义NotFoundException。问题是当我返回Mono时,控制器抛出404错误,但当我返回更新的class对象时,它运行正常,我不想返回整个对象 以下代码运行良好Java 返回Mono Void时出现404错误,java,spring-webflux,Java,Spring Webflux,我正在使用SpringWebFlux创建一个用于学习的web应用程序,我有一个函数,它首先检查记录是否存在,然后更新记录,否则抛出自定义NotFoundException。问题是当我返回Mono时,控制器抛出404错误,但当我返回更新的class对象时,它运行正常,我不想返回整个对象 以下代码运行良好 public Mono<Application> publish(String id,boolean publish) { return appRepository.find
public Mono<Application> publish(String id,boolean publish)
{
return appRepository.findById(id).flatMap( a -> {
a.setPublished(publish);
return appRepository.save(a);
}).switchIfEmpty( Mono.error(new NotFoundException("Application Not Found")));
}
公共Mono发布(字符串id,布尔发布)
{
返回appRepository.findById(id).flatMap(a->{
a、 出版(出版);;
返回附件。保存(a);
}).switchIfEmpty(Mono.error(newnotfoundexception(“未找到应用程序”));
}
下面是发生404错误的代码
public Mono<Void> publish(String id,boolean publish)
{
return appRepository.findById(id).flatMap( a -> {
a.setPublished(publish);
appRepository.save(a);
return Mono.empty().then();
}).switchIfEmpty( Mono.error(new NotFoundException("Application Not Found")));
}
公共Mono发布(字符串id,布尔发布)
{
返回appRepository.findById(id).flatMap(a->{
a、 出版(出版);;
估价保存(a);
返回Mono.empty().then();
}).switchIfEmpty(Mono.error(newnotfoundexception(“未找到应用程序”));
}
我已经从ReactiveMongoRepository扩展了存储库,控制器类只是调用服务函数
@PutMapping(APP_ROOT_URL + "/{id}/publish")
public Mono<Void> publish(@PathVariable("id") String id)
{
return appService.publish(id, true);
}
@PutMapping(APP_ROOT_URL+“/{id}/publish”)
公共Mono发布(@PathVariable(“id”)字符串id)
{
返回appService.publish(id,true);
}
第一个方法不返回404,因为:
appRepository.save(a)返回持久化实体。不是空单声道。因此不会触发switchIfEmpty子句。
这来自ReactiveCrudepository(ReactiveMongoRepository的父存储库之一)的文档
如果您希望方法的返回类型为Mono
,则只需使用如下内容:
public Mono<Application> publish(String id,boolean publish)
{
return appRepository.findById(id)
.switchIfEmpty( Mono.error(new NotFoundException("Application Not Found")))
.flatMap( a -> {
a.setPublished(publish);
return appRepository.save(a);
});
}
public Mono<Void> publish(String id, boolean publish)
{
return appRepository.findById(id)
.switchIfEmpty( Mono.error(new NotFoundException("Application Not Found")))
.flatMap( a -> {
a.setPublished(publish);
return appRepository.save(a);
})
.then();
}
公共Mono发布(字符串id,布尔发布)
{
返回appRepository.findById(id)
.switchIfEmpty(Mono.error(newnotfoundexception(“未找到应用程序”))
.flatMap(a->{
a、 出版(出版);;
返回附件。保存(a);
})
.然后();
}
第一个方法不返回404,因为: appRepository.save(a)返回持久化实体。不是空单声道。因此不会触发switchIfEmpty子句。 这来自ReactiveCrudepository(ReactiveMongoRepository的父存储库之一)的文档 如果您希望方法的返回类型为
Mono
,则只需使用如下内容:
public Mono<Application> publish(String id,boolean publish)
{
return appRepository.findById(id)
.switchIfEmpty( Mono.error(new NotFoundException("Application Not Found")))
.flatMap( a -> {
a.setPublished(publish);
return appRepository.save(a);
});
}
public Mono<Void> publish(String id, boolean publish)
{
return appRepository.findById(id)
.switchIfEmpty( Mono.error(new NotFoundException("Application Not Found")))
.flatMap( a -> {
a.setPublished(publish);
return appRepository.save(a);
})
.then();
}
公共Mono发布(字符串id,布尔发布)
{
返回appRepository.findById(id)
.switchIfEmpty(Mono.error(newnotfoundexception(“未找到应用程序”))
.flatMap(a->{
a、 出版(出版);;
返回附件。保存(a);
})
.然后();
}
请将lang和platform添加为标记。@海德尔希望我的回答澄清您的疑问。@abhinabacharaborty是的,非常感谢。请将lang和platform添加为标记。@海德尔希望我的回答澄清您的疑问。@abhinabacharaborty是的,非常感谢。