【发布时间】:2019-11-14 14:05:41
【问题描述】:
WebFlux、反应式和处理程序的新手。
我能够从 ServerRequest 获取 Mono 并处理包含的 POJO 以将新元组添加到数据库。但是,似乎应该有一种“更好”或“更容易接受”的方式来编写这段代码。
如果对 AccountRequestHandler 中的代码提供任何帮助/输入,我们将不胜感激,尤其是对建议更改背后的基本原理的解释。
路由器实现(精简为仅“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)
));
}
}
处理程序实现... 我实际执行添加,然后分别创建 ServerResponse 的代码是我关注的内容。这似乎很“笨拙”,特别是因为 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();
}
}
感谢所有帮助提升这种编程风格的人......
【问题讨论】:
标签: functional-programming httpresponse spring-webflux