我有一种方法可以在控制器中下载消息
@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条答案
按热度按时间9avjhtql1#
作为一般的经验法则,我会说这类业务逻辑应该在服务中。控制器应该是轻量级的,并传递请求。此外,可能还有其他服务客户端,而不仅仅是控制器,所以这允许您在一个地方进行验证。
7dl7o3gd2#
1.不要将此验证放在控制器中-控制器部分只是传入请求和公开API的入口点。
1.我建议你创建一个额外的服务来负责做验证,并将这个服务注入到你的messageSearchService服务中。这样你就可以在其他需要相同验证的服务中使用验证服务。另外,这就是为什么你遵循每个类只有一个自己的职责的原则。