2017-02-13 5 views
0

次のControllerAdviceを設定して、特定のユーザーに所属する「要求」オブジェクトの現在の数を確認しました。ControllerAdvice属性を複数回更新する際に問題が発生しました

@ControllerAdvice 
public class ApplicationAdvice { 

    private static final Logger log = LoggerFactory.getLogger(ApplicationAdvice.class); 

    @Autowired 
    UsersRepository usersRepository; 

    @Autowired 
    RequestRepository requestRepository; 

    @ModelAttribute("numRequests") 
    public int numRequests(Principal principal, Model model) { 
     Users user = usersRepository.findOneByInitialName(principal.getName()); 
     if (user != null) { 
      log.info(user.getId().toString()); 

      // TODO Find all APPROVED requests if user is EMPLOYEE and all PENDING requests is user is MANAGER 
      // TODO Reset to 0 once we hit /requests page 
      // TODO Update this value on page refresh if not on /requests page 
      for (RequestDO requestDO : requestRepository.findByUsersAndStatus(user, RequestStatus.PENDING)) { 

       ArrayList<RequestDO> requestsList = new ArrayList<>(); 
       requestsList.add(requestDO); 

       int numRequests = requestsList.size(); 
       log.info(String.valueOf(numRequests)); 
       model.addAttribute("numRequests", numRequests); 
       return numRequests; 
      } 
     } 
     return 0; 
    } 
} 

私は、インデックステンプレートの「ヘッダー」、フラグメントに属性「numRequests」を渡す:header.htmlフラグメント内

<body> 

<div class="container" style="width: 100% !important;"> 

    <div th:replace="fragments/header :: header"></div> 

    <div th:replace="fragments/null :: null"></div> 

    <div th:replace="fragments/footer :: footer"></div> 

</div> 

</body> 

、私は短いif statementを持っているの値を表示しますこの属性:

<th:block th:if="${numRequests} != '0'"> 
    <div style="float: left; margin-right: 10px;">My Requests</div> 
    <div style="overflow: hidden" class="circle"> 
     <th:block th:text="${numRequests}"></th:block> 
    </div> 
</th:block> 

これはすべて正常に動作します。データベースに要求オブジェクトがない場合、何も表示されません。ただし、0より大きい場合は、循環通知バッジが表示され、正しく番号1が表示されます。問題は、さらに多くの要求オブジェクトが作成されても、常に1が表示されることです。それらを正しく照会する必要があります。私は論理の点でここに何か根本的なものを見逃していますか?おそらく属性値は何らかの理由で一度だけ更新されるでしょうか?あなたはすべての反復ごとのように、ループ内requestsListを初期化

答えて

1

は、新しい空のArrayListオブジェクトを作成し、それを1つのRequestDOオブジェクトを追加さ​​れます。また、ループ内にreturnステートメントがあるため、関数は最初の反復の後に終了します。だからこそ、データベースにリクエストがあるときは1を、そうでないときは0を受け取るのです。

基本的にループは不要です。要求を繰り返す際にそれ以上のロジックがない場合は、のループ全体をに捨てることができます。

関連する問題