我有一种在控制器中下载消息的方法
@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));
}
现在我的问题是它是应该在控制器还是服务中完成?我宁愿在服务中这样做,但我不知道它是否合适。
答案 0 :(得分:1)
作为一般的经验法则,我会说这种业务逻辑应该在服务中。控制器应该重量轻并传递请求。此外,您的服务可能还有其他客户端,而不仅仅是控制器,因此您可以在一个地方进行验证。
答案 1 :(得分:0)
不要将此验证放在控制器中 - 控制器部分只是即将到来的请求和公开API的入口点。
我建议您创建额外的服务,负责进行验证并在您的服务中注入此服务 messageSearchService服务。这样您就可以使用验证 其他服务中的服务也需要相同的验证。在 另外,这就是为什么你遵循每个班级的原则而已 一个人自己的责任。
我希望这会有所帮助。