返回Mono Void时出现404错误

海德:

我正在使用Spring Web Flux创建一个用于学习目的的Web应用程序,我有一个函数,该函数首先检查记录是否存在,然后对其进行更新,否则它将引发自定义NotFoundException。问题是当我返回Mono时,控制器抛出404错误,但是当我返回已更新的类对象时,它运行良好,并且我不想返回整个对象。

以下代码运行正常

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")));
}

及以下发生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")));
}

我已经从ReactiveMongoRepository扩展了存储库,并且控制器类只是在调用服务函数

@PutMapping(APP_ROOT_URL + "/{id}/publish")
public Mono<Void>  publish(@PathVariable("id") String id)
{
    return appService.publish(id, true);
}
Abhinaba Chakraborty:

第一个方法不返回404,因为:

appRepository.save(a)返回保留的实体。不是一个空的单声道。因此,不会触发switchIfEmpty子句。

这来自ReactiveCrudRepository(ReactiveMongoRepository的父存储库之一)的文档

   /**
     * Saves a given entity. Use the returned instance for further operations as the save operation might have changed the
     * entity instance completely.
     *
     * @param entity must not be {@literal null}.
     * @return {@link Mono} emitting the saved entity.
     * @throws IllegalArgumentException in case the given {@literal entity} is {@literal null}.
     */
    <S extends T> Mono<S> save(S entity);

在第二种方法中,您将明确返回空单声道。这就是为什么switchIfEmpty子句被触发的原因。

我还要指出一件事:switchIfEmpty子句放置不正确由于findById返回空单,如果记录没有找到一个id,switchIfEmpty应该来之后。如果放在switchIfEmpty之后save,它将永远不会返回空的单声道。

所以你应该有这样的东西:

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);
    });
}

如果您希望该方法的返回类型为,Mono<Void>则只需执行以下操作:

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();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我应该如何包括函数返回一个单声道时使用Mono.zipWith?

如何模拟返回`Mono <Void>`的方法

返回Mono和Flux错误始终返回500

Reactor Mono,如何同步处理(使用.map())并从response.setComplete()返回Mono <void>

加载js文件时返回404错误

如何从数据库中获取任何内容时如何使服务层返回Mono :: error

WebFlux-如何检查Mono <ResponseEntity <Flux <MyItem >>>是否为空以返回404

我正在使用来自springframework的@PathVariable。当我尝试从控制器返回视图页面名称时,出现404错误

Mono :: then返回null

烧瓶的静态资产在推入弹性beantalk时返回404错误

返回TList时出现Delphi错误

Spring Web-flux侧面操作返回Mono <Void>

使用Spring Webflux时在后台运行Mono并返回响应

加载查看器时,Safari返回lmvworker 404错误

从返回Mono <Void>的方法进行WebFlux链接

从API返回结果列表时出现异常错误

NGINX在页面重新加载时返回404错误(Ember应用)

从Mono.fromCallable返回Mono.empty()

如何使Mono Void在另一个Mono Void中返回?

wget返回404错误

如何在其他情况下正确返回,避免出现关于返回的错误的“ void”

从Node.js返回URL时出现“错误:捕获”

函数返回时出现分段错误

函数返回类型为 Promise<{ then: () => void }> 时打字稿错误

添加尾部斜杠时,NGINX 返回 404 错误

Strapi 从 Gatsby 获取数据时返回 404 错误

当@Controller 返回反应类型(Mono)时,如何设置@ExceptionHandler 提供的响应的状态代码?

Mono 返回空列表

Flask 在尝试通过 localhost 连接时返回 404 错误