Desde el DefaultMessageContext he visto que hay un comprador para todos los mensajes que le da una gran variedad de los mensajes en el contexto del mensaje y que haciendo un bucle sobre la matriz puedo encontrar los mensajes para el campo que está prestando actualmente:
<c:forEach var="topic" items="${model.selectedTopics}" varStatus="loop">
//omitted displaying of topic details
<c:forEach items="${flowRequestContext.messageContext.allMessages}" var="message">
<c:set var="msgSrc" value="selectedTopics[${loop.index}].room"></c:set>
<c:if test="${message.source eq msgSrc}">
<c:if test="${message.severity eq 'INFO'}">
<span class="infoText">${message.text}</span>
</c:if>
</c:if>
</c:forEach>
</c:forEach>
Pero de esta forma la iteración de todos los mensajes se realiza para cada campo que se debe renderizar y si tiene muchos campos, esto puede ser lento.
Otra forma en que esto se puede lograr es obtener el mapa de mensajes que se encuentra en el contexto del mensaje. Este es un ejemplo del contexto outputed en JSP, que solía $ {} 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']]]]
Hay un mapa sourceMessages que mantiene todos los mensajes para un campo que se pueden recuperar con la fuente como una llave. Pero el problema es que no hay getter para el mapa en la implementación org.springframework.binding.message.DefaultMessageContext. Sin embargo, existe un método getMessagesBySource (fuente java.lang.Object) que proporciona una matriz de mensajes para la fuente especificada. Entonces podemos usar eso en la expresión EL.
¡IMPORTANTE! Pasar los argumentos del método en EL es solo por las especificaciones EL soportadas en EL 2.2. EL 2.2 se envía por defecto en los contenedores Servlet 3.0/JSP 2.2. Ver JSTL or JSP 2.0 EL for getter with argument
Así que ahora la información se puede visualizar 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>
Si es necesario utilizar la versión anterior de Servlet 3.0/JSP 2.2 contenedores que yo creo que la mejor manera es reconstruir las sourceMessages mapa y insértelo en flashScope antes de renderizar la vista.