Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回Mono Void时出现404错误_Java_Spring Webflux - Fatal编程技术网

Java 返回Mono Void时出现404错误

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

我正在使用SpringWebFlux创建一个用于学习的web应用程序,我有一个函数,它首先检查记录是否存在,然后更新记录,否则抛出自定义NotFoundException。问题是当我返回Mono时,控制器抛出404错误,但当我返回更新的class对象时,它运行正常,我不想返回整个对象

以下代码运行良好

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是的,非常感谢。