2017-02-13 2 views
0

Ich habe den folgenden ControllerAdvice eingerichtet, um die aktuelle Anzahl von "Request" -Objekten zu überprüfen, die zu einem bestimmten Zeitpunkt zu einem bestimmten Benutzer gehören.Fehler beim Aktualisieren des ControllerAdvice-Attributs mehr als einmal

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

gebe ich das Attribut "numRequests" auf ein Fragment, "Header" in meinem Index Vorlage:

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

Im Inneren des header.html Fragment, ich habe eine kurze if statement, die den Wert zeigt von Dieses Attribut:

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

So funktioniert das alles gut. Wenn in der Datenbank 0 Anfrageobjekte vorhanden sind, wird nichts angezeigt. Wenn es jedoch mehr als 0 gibt, wird eine kreisförmige Benachrichtigungsleiste angezeigt und die Nummer 1 korrekt angezeigt. Das Problem ist, dass egal wie viele weitere Anfrageobjekte erstellt werden, immer noch die Nummer 1 angezeigt wird. Ich bin sicher, dass ich m für sie richtig abfragen. Fehle ich etwas Grundlegendes hier in Bezug auf Logik? Vielleicht wird der Attributwert nur einmal aus irgendeinem Grund aktualisiert?

Antwort

1

Sie initialisieren requestsList Looping so pro jede Iteration neues leeres ArrayList Objekt erstellt wird und hinzugefügt ein RequestDO Objekt zu. Sie haben auch return Anweisung innerhalb der Schleife, so endet die Funktion nach der ersten Iteration. Deshalb erhalten Sie immer 1 wenn es Anfragen in der Datenbank gibt und 0 wenn nicht.

Grundsätzlich ist die Schleife unnötig. Wenn es keine weitere Logik in diesem Iterieren über Anforderungen gibt, können Sie die gesamte für Schleife:

@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; 
} 
verwerfen
Verwandte Themen