在控制器或服务中验证?

时间:2017-09-28 23:56:35

标签: java spring spring-mvc spring-boot

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

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

  1. 不要将此验证放在控制器中 - 控制器部分只是即将到来的请求和公开API的入口点。

  2. 我建议您创建额外的服务,负责进行验证并在您的服务中注入此服务 messageSearchService服务。这样您就可以使用验证 其他服务中的服务也需要相同的验证。在 另外,这就是为什么你遵循每个班级的原则而已 一个人自己的责任。

  3. 我希望这会有所帮助。