2017-09-28 14 views
0

私はコントローラコントローラまたはサービスの検証?

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

私の質問はコントローラかサービスで行うべきかどうかです。私はサービスでこれを行うことを好むでしょうが、それが適切かどうかわかりません。

答えて

1

大雑把に言えば、私はこの種のビジネスロジックがサービスにあるべきだと言います。コントローラーは軽量で、要求に応じる必要があります。さらに、コントローラだけでなく、サービスの他のクライアントも存在する可能性があります。そのため、1つの場所で検証を続けることができます。

0
  1. コントローラでこの検証を実行しないでください - コントローラの部分は、来る要求と公開するためのエントリポイントです。

  2. messageSearchServiceサービスで、このサービスの検証とインジェクションを担当する追加のサービスを作成することをお勧めします。この方法で、他のサービスで検証 サービスを使用することもできますが、これは同じ検証が必要です。 In 追加、これはなぜ各クラスの原則に従うだけ それ自身の責任があります。

これが役立ちます。

関連する問題