Las imágenes BLOB se muestran solo al actualizar una página después de una actualización a través de p: dataTable se realiza en PrimeFaces

Estoy mostrando imágenes almacenadas en forma de BLOB en MySQL en un<p:graphicImage> como sigue.

<p:dataTable var="row" value="#{testManagedBean}" lazy="true" editable="true" rows="10">
    <p:column headerText="id">
        <h:outputText value="#{row.brandId}"/>
    </p:column>

    <p:column headerText="Image">
        <p:cellEditor>
            <f:facet name="output">
                <p:graphicImage value="#{brandBean.image}" height="100" width="100">
                    <f:param name="id" value="#{row.brandId}"/>
                </p:graphicImage>
            </f:facet>
            <f:facet name="input">
                <p:graphicImage id="image" value="#{brandBean.image}" height="100" width="100">
                    <f:param name="id" value="#{row.brandId}"/>
                </p:graphicImage>
            </f:facet>
        </p:cellEditor>
    </p:column>

    <p:column headerText="Edit" width="50">
        <p:rowEditor/>
    </p:column>
</p:dataTable>

Mientras edita una fila, un<p:fileUpload> se muestra en un<p:overlayPanel>. Esta y muchas otras cosas se omiten en este ejemplo en aras de la simplicidad, ya que no están relacionadas con el problema concreto.

El bean gestionado JSF asociado:

@ManagedBean
@ViewScoped
public final class TestManagedBean extends LazyDataModel<Brand> implements Serializable
{
    @EJB
    private final TestBeanLocal service=null;
    private static final long serialVersionUID = 1L;

    @Override
    public List<Brand> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
        setRowCount(3);
        return service.getList();
    }
}

El bean que recupera imágenes de la base de datos en función de un identificador de fila único:BrandBean.

@ManagedBean
@ApplicationScoped
public final class BrandBean
{
    @EJB
    private final BrandBeanLocal service=null;
    public BrandBean() {}

    public StreamedContent getImage() throws IOException {
        FacesContext context = FacesContext.getCurrentInstance();

        if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
            return new DefaultStreamedContent();
        }
        else {
            String id = context.getExternalContext().getRequestParameterMap().get("id");
            System.out.println("id = "+id);
            byte[] bytes = service.findImageById(Long.parseLong(id));
            return bytes==null? new DefaultStreamedContent(new ByteArrayInputStream(new byte[0])):new DefaultStreamedContent(new ByteArrayInputStream(bytes));
        }
    }
}

Cuando se actualiza una fila (después de que se edita) haciendo clic en una marca ubicada (indicada por<p:rowEditor>) en la última columna de la tabla de datos, elgetImage() método en elBrandBean se invoca como debería.

Esto sucede correctamente en una aplicación que se ejecuta en el servidor GlassFish 4.0 con PrimeFaces 5.0 y JSF 2.2.6.

Se mostrará una nueva imagen en la tabla de datos inmediatamente después de que se actualice una fila en la tabla de datos (y, en consecuencia, en la base de datos).

Hay otra aplicación ejecutándose en el servidor Tomcat 8.0.5 usando Spring 4.0.0 GA en la cualelgetImage() el método no se invoca después de que se actualiza una fila mantenida por la tabla de datos, lo que sigue mostrando elimagen antigua (no el recién actualizado) en la tabla de datos (aunque los cambios se propaguen correctamente a la base de datos).

La imagen recién actualizada se muestra solo cuando la página se actualiza presionandoF5 (en la mayoría de los navegadores). Incluso no se muestra en la carga de la página (ingresando una URL en la barra de direcciones y luego presionando el botónentrar llave).

En otras palabras, cuando una fila de una tabla de datos se actualiza haciendo clic en la marca indicada por<p:rowEditor>, elgetImage() no se invoca el método (por lo tanto, la nueva imagen no se obtiene de la base de datos para mostrarla en<p:graphicImage>) Este método se invoca solo cuando la página se actualiza / recarga presionando el botónF5 tecla de acceso directo.

¿Por qué pasó esto? ¿Cómo mostrar una imagen recién actualizada inmediatamente después de actualizar una fila?

Superficialmente, esto no debería estar relacionado con Spring ni JPA (la operación de actualización se propaga correctamente a la base de datos después de hacer clic en la marca). Esto debería estar relacionado con el servidor Tomcat.

Respuestas a la pregunta(2)

Su respuesta a la pregunta