Dal DefaultMessageContext ho visto che c'è un getter per tutti i messaggi che dà una serie di messaggi nel contesto del messaggio e che da loop sopra la matrice posso trovare i messaggi per il campo che sta attualmente Rendering:
Ma in questo modo l'iterazione su tutti i messaggi viene eseguita per ogni campo che deve essere renderizzato e se si dispone di molti campi, questo potrebbe essere lento.
Un altro modo per ottenere ciò è ottenere la mappa dei messaggi nel contesto del messaggio. Ecco un esempio del contesto in output in jsp, ho usato $ {} flowRequestContext.messageContext:
[[email protected] sourceMessages = map[[null] -> list[[empty]], 'selectedTopics[2].room' -> list[[[email protected] source = 'selectedTopics[2].room', severity = INFO, text = 'Room changed from ALU1-M1 to ALU1-M2']], 'selectedTopics[4].room' -> list[[[email protected] source = 'selectedTopics[4].room', severity = INFO, text = 'Room changed from ALU1-M1 to ALU2-M1']]]]
C'è una mappa sourceMessages che detiene tutti i messaggi per un campo che possono essere recuperati con la fonte come chiave. Ma il problema è che non c'è getter per la mappa nell'implementazione org.springframework.binding.message.DefaultMessageContext. Tuttavia, esiste un metodo getMessagesBySource (origine java.lang.Object) che fornisce una matrice di messaggi per l'origine specificata. Quindi possiamo usarlo nell'espressione EL.
IMPORTANTE! Passare gli argomenti del metodo in EL è solo con le specifiche EL supportate in EL 2.2. EL 2.2 è fornito per impostazione predefinita in contenitori Servlet 3.0/JSP 2.2. Si veda JSTL or JSP 2.0 EL for getter with argument
Così ora informazioni possono essere visualizzati con:
<c:forEach var="message" items="${flowRequestContext.messageContext.getMessagesBySource(msgSrc)}">
<c:if test="${message.severity eq 'INFO'}">
<span class="info">${message.text}</span></td>
</c:if>
</c:forEach>
Se è necessario utilizzare la versione precedente di Servlet 3.0/JSP 2.2 contenitori di quanto penso che il modo migliore è quello di ricostruire le sourceMessages mappa e inseriscilo in flashScope prima di renderizzare la vista.