2017-02-13 48 views
0

我设置了以下ControllerAdvice以检查在任何给定时间属于某个用户的“Request”对象的当前数量。不止一次更新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”的片段,“标题”,在我的索引的模板:

<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> 

里面了header.html片段,我有一个短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个请求对象,则不显示任何内容。但是,如果超过0,则会显示一个循环通知标志并正确显示数字1.问题是无论创建了多少个请求对象,我仍然始终看到数字1.我确信,正确地查询它们。我在逻辑上错过了一些基本的东西吗?也许属性值只是出于某种原因更新一次?

回答

1

你初始化内部循环requestsList所以每创建一个新的空ArrayList对象并添加一个RequestDO对象。循环内部还有return声明,所以函数在第一次迭代后结束。这就是为什么当数据库中有请求时总是收到1,而当没有请求时总是收到0。

基本上循环是不必要的。如果在迭代请求中没有进一步的逻辑,则可以丢弃整个for loop:

@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 

     List<RequestDO> requestsList = requestRepository.findByUsersAndStatus(user, RequestStatus.PENDING); 

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