当前位置: 首页 > 知识库问答 >
问题:

“添加”似乎在WebFlux中工作,但似乎必须有一种“更可接受的方式”

姬旭
2023-03-14

WebFlux、反应式和处理程序的新功能。

我能得到单声道

任何对Account tRequest estHandler中代码的帮助/输入都将不胜感激,尤其是解释建议更改背后的基本原理。

路由器实现(分解为仅“POST”)。。。

@Configuration
public class AccountRequestRouter {

    @Bean
    public RouterFunction<ServerResponse> route(AccountRequestHandler requestHandler) {
        return nest(path("/v2"),
                   nest(accept(APPLICATION_JSON),
                      .andRoute(RequestPredicates.POST("/accounts"), requestHandler::addAccount)
                       ));
    }
}

处理程序实现...我真正做添加的代码,然后单独创建一个服务器响应,是我关注的。它看起来“笨拙”,尤其是因为AccountService.addAccount()在完成时返回一个Mono。

@Component
public class AccountRequestHandler {

    @Autowired
    private mil.navy.ccop.service.accounts.account.AccountService accountService;

    public Mono<ServerResponse> addAccount(ServerRequest request) {
        return request.bodyToMono(Account.class).flatMap(account -> {
                                                                        accountService.addAccount(account);
                                                                        return ServerResponse.ok().build();
                                                                    })
                                                .switchIfEmpty(ServerResponse.badRequest()
                                                                             .contentType(APPLICATION_JSON)
                                                                             .build(Mono.empty()));
    }
}

AccountService实现(再次,被剥离)。。。

@Service
class AccountService {

    @Autowired
    private AccountRepository accounts;

    public AccountService() {
    }

    public Mono<Void> addAccount(Account account) {
        Account proxy;

        // make sure that accountId is set to support auto-generation of synthetic key value
        proxy = new Account(-1, account.getShortName(), account.getLongName(), account.getDescription());
        accounts.save(proxy);
        return Mono.empty();
    }
}

感谢所有在提升这种编程风格方面的帮助。。。。

共有1个答案

阎麒
2023-03-14

首先,你有2个addAccount,这可能有点混乱。

第二,你也在写什么样的“存储库”?如果是sql repo,则需要将其正确包装在<code>Mono中。fromCallable()否则它将阻塞<code>反应性

是的,还有其他做事方式。很多人倾向于在平面图地图中做事,当然在这里做事是完全可能的,但对于语义,我会说它不太好。

map平面图通常用于对单声道的内部值执行某种计算,然后返回相同或新的值和或单声道内部的类型。

我会把它改写成这样。

在此返回void:

public void addAccount(Account account) {
    Account proxy;

    // make sure that accountId is set to support auto-generation of synthetic key value
    proxy = new Account(-1, account.getShortName(), account.getLongName(), account.getDescription());
    accounts.save(proxy);
}

这里:

public Mono<ServerResponse> addAccount(ServerRequest request) {
    return request.bodyToMono(Account.class)
                .doOnSuccess(account -> {
                            accountService.addAccount(account);
                }).then(ServerResponse.ok().build())
                  .switchIfEmpty(ServerResponse.badRequest()
                                      .contentType(APPLICATION_JSON)
                                      .build());
}

有许多不同的doOn方法可用于消费和对事物产生“副作用”。像doOnSuccessdoOnErrordoOnCancel等。

你也有然后然后返回,这将只返回你放入其中的任何东西。然后返回您放入其中的任何内容 Mono然后返回将您放入其中的任何值包装到 Mono 中并返回它。

 类似资料:
  • 因此,正如一个人在之前的帖子中所说的,我会使用: 包括行末的“我的文件”。 由于未使用,我想我应该在标准输出中接收操作的结果。然后执行它并获得(注意,我使用而不是只是为了查看是否可以根据需要修改文件,因为在本例中,文件已经有了所需的行): 所以如您所见,文件没有更改。我做错了什么? 感谢阅读

  • 问题内容: 已解决:问题是Wingware Python IDE。我想现在自然而然的问题是,这是怎么可能的以及如何解决。 昨天我问了一个问题Python中的multiprocessing.Pool问题,这个问题几乎相同,但是我发现它似乎可以在Windows计算机上运行,​​而不能在我的Ubuntu上运行。在本文的结尾,我将发布执行相同功能的代码的稍有不同的版本。 我的问题的简短摘要:在Python

  • 我正在开发新的web,我想使用ArcGIS javascript API4使用WMTS服务 选择空间参考EPSG:25830时,Javascript API 4.11中的WMTSLayer似乎不起作用。 问题是API生成的请求不正确,Tilerow参数错误。 正在发送的请求是这样的。http://www.ign.es/wmts/ign-base?SERVICE=WMTS 而且一定是... http

  • 我试图将JMX与activeMQ一起用于监控。到目前为止,我一直将其作为参考,但到目前为止我无法远程连接到JMX,而且我在activeMQ日志中没有看到任何提到JMX url的内容。我想知道是否有其他方法来确保jmx工作正常?它应该在activemq日志中显示吗?PS我正在使用jdk1.7和activeMQ 5.14.2。 提前感谢! 编辑 我在activemq.xml文件中设置了useJmx="

  • 我在Windows上,我已经在环境变量中设置了JDK 1.8的路径。同样在项目结构方面,我已经改变了。我有一个Maven项目。 在命令行中,如果我使用“mvn--version”,我会看到 然而,在IntelliJ中,如果我点击Run按钮,它总是指向JDK 1.7,并抛出一个错误(因为我的maven项目需要java 8)。我该怎么改变呢?谢谢 更新在遵循@BevyQ提示后,我发现Maven run

  • 我对python还很陌生,我正在尝试创建21点。然而,当我试图打印出玩家的手牌时,我遇到了一些困难。 这是我的击球(抽牌)代码: 这是我打印卡片的代码: 我的代码所做的第一件事是为庄家和玩家抽两张牌,这运行得很好。然而,当玩家抽到一张牌后,它就会变得有点摇摆不定。输出如下所示: 当我抽到一张新牌时,这张牌不变,它保持我抽到的最后一张牌。然后,当我打印我的甲板,它打印我的旧甲板和我的新甲板。但是,分