2

在 PrimeFaces Web 应用程序中,webapps/<img src="...">使用<p:graphicImage>. 画廊的很多图像通过 ID 循环打印出来。对于或多或少的大量图像,有时会加载 90% 的图像,有时(特别是如果我在返回StreamedContent对象的 getter 方法中设置断点)只有一个。加载哪些图像以及加载多少图像是完全随机的。

加载了一些图像的画廊图像,其他没有

由于确实加载了各种图像(也在它们的正确位置),我认为我的基本编码不会太错误。该方法中的一些调试输出向我显示,返回 的 getterStreamedContent是在第二阶段为渲染的图像调用的。对于未渲染的图像,它不会被调用。在 Firefox 的网络面板中,发送了相应的 HTTP 请求,并以 0 字节返回:

在此处输入图像描述

尽管我将根记录器设置为调试,但我在任何地方都没有得到任何异常或堆栈跟踪,无论是在网络控制台上还是在我的日志中。(我有一个很长的日志,但没有任何东西可以向我解释。)某些 HTTP 请求在哪里或为什么没有正确响应?

这是生成图库的 JSP 代码

<p:dataList styleClass="structureElementDataList"
            id="structureElementDataList"
            var="media"
            value="#{stripe.medias}"
            binding="#{structuredThumbnail}">
    <p:panel id="structuredPagePanel">
        <p:commandLink update="structureTreeForm, imagePreviewForm">
            <div class="thumbnail-container">
                <p:graphicImage value="#{DataEditorForm.galleryPanel.previewData}" class="thumbnail #{DataEditorForm.galleryPanel.selectedMedia eq media ? 'active' : ''}" rendered="#{media.showingInPreview}">
                    <f:param name="id" value="#{media.id}" />
                </p:graphicImage>
                <div class="thumbnail-overlay">
                    #{msgs.image} #{media.order}, #{msgs.page} #{media.orderlabel}
                </div>
            </div>
            <f:setPropertyActionListener value="#{media}" target="#{DataEditorForm.galleryPanel.selectedMedia}"/>
            <f:setPropertyActionListener value="#{stripe}" target="#{DataEditorForm.galleryPanel.selectedStripe}"/>
        </p:commandLink>
    </p:panel>
    <p:draggable id="structuredPagesDraggable" for="imagePreviewForm:structuredPages:#{currentElement.rowIndex}:structureElementDataList:#{structuredThumbnail.rowIndex}:structuredPagePanel"
                 revert="true" stack=".ui-panel"/>
</p:dataList>

这是Java

public StreamedContent getPreviewData() {
    FacesContext context = FacesContext.getCurrentInstance();
    if (context.getCurrentPhaseId() != PhaseId.RENDER_RESPONSE) {
        String id = context.getExternalContext().getRequestParameterMap().get("id");
        GalleryMediaContent mediaContent = previewImageResolver.get(id);
        if (Objects.nonNull(mediaContent)) {
            return mediaContent.getPreviewData();
        }
    }
    return new DefaultStreamedContent();
}

但是,正如我所说,这段代码部分时间有效,所以我真的不明白我做错了什么。Tomcat 或 JSF 是否对我需要增加的请求有限制?因为如果我设置了一个断点,我只会加载一个图像,这使它看起来像是一个时间问题。(也没有很多线程在那个断点处停止,这是我所期望的,但只有一个。)

软件版本:
Java 8.114
Tomcat:8.0.52
MySQL:5.7.19
ElasticSearch:5.6.1
OmniFaces:2.6.3
SpringFaces:2.4.5.RELEASE
MyFaces:2.2.12
PrimeFaces:6.2
PrimeFaces Extensions:6.1.1
Hibernate:5.3。 7.最终
平台:Windows 10

4

0 回答 0