Spring Boot 在控制器或服务中确认?

8yparm6h  于 2022-12-29  发布在  Spring
关注(0)|答案(2)|浏览(158)

我有一种方法可以在控制器中下载消息

@GetMapping(value = "/sent/{id}")
public
HttpEntity<MessageSent> getMessageSent(
        @ApiParam(value = "The message ID", required = true) @PathVariable Long id
) {
    return ResponseEntity.ok().body(messageSearchService.getMessageSent(id, authorizationService.getUserId()));
}

但是,我忘记了验证关于给定ID的消息是否属于用户,在服务中也没有这样做。

@Override
public MessageSent getMessageSent(
        @Min(1) Long messageId,
        @Min(1) Long userId
) throws ResourceNotFoundException {
    Optional<UserEntity> user = this.userRepository.findByIdAndEnabledTrue(userId);
    user.orElseThrow(() -> new ResourceNotFoundException("No user found with id " + userId));

    return this.messageRepository.findByIdAndSenderAndIsVisibleForSenderTrue(messageId, user.get())
            .map(MessageEntity::getSentDTO)
            .orElseThrow(() -> new ResourceNotFoundException("No message found with id " + messageId));
}

现在我的问题是,它应该在控制器中还是在服务中完成?我更愿意在服务中完成,但我不知道它是否合适。

9avjhtql

9avjhtql1#

作为一般的经验法则,我会说这类业务逻辑应该在服务中。控制器应该是轻量级的,并传递请求。此外,可能还有其他服务客户端,而不仅仅是控制器,所以这允许您在一个地方进行验证。

7dl7o3gd

7dl7o3gd2#

1.不要将此验证放在控制器中-控制器部分只是传入请求和公开API的入口点。
1.我建议你创建一个额外的服务来负责做验证,并将这个服务注入到你的messageSearchService服务中。这样你就可以在其他需要相同验证的服务中使用验证服务。另外,这就是为什么你遵循每个类只有一个自己的职责的原则。

相关问题