使用 PrettyFaces 调用 FileUploadListener 时重建 ViewScoped bean

2023-12-13

我已经插入了一个<p:fileUpload />组件到我的JSF 2.1.5应用。我在用着PrimeFaces 3.4.1。该组件由@ViewScoped豆。我的表格是这样的:

<?xml version='1.0' encoding='UTF-8' ?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui"
template="/templates/general_template.xhtml">

<ui:define name="metadata">
    <f:metadata>

        <f:viewParam id="NavIndex" name="NavIndex"
            value="#{navegableMassiveUserAdd._QueueIndex}" />
        <f:event type="preRenderView"
            listener="#{navegableMassiveUserAdd.initialize}" />
    </f:metadata>
</ui:define>

<ui:define name="general_content">
    <h:form>

        <p:fileUpload
            fileUploadListener="#{navegableMassiveUserAdd.listener}"
            mode="advanced" allowTypes="/(\.|\/)(xls|csv)$/"
            label="#{msg.SELECT}" multiple="false" />

        <p:commandButton id="cancelButton"
            action="#{navegableMassiveUserAdd.actionCancelAdd}"
            value="#{msg.CANCELAR}" ajax="false" style="margin: 9px 0px 5px;" />
    </h:form>
</ui:define>

这是我的主要模板:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
                  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui" xmlns:o="http://omnifaces.org/ui">


<h:head>
    <meta http-equiv="Pragma" CONTENT="no-cache"></meta>
    <meta http-equiv="cache-control" content="no-cache"></meta>
    <meta http-equiv="Expires" CONTENT="-1"></meta>
    <meta http-equiv="Content-Type"
        content="text/html; charset=ISO-8859-15" />
    <h:outputStylesheet library="css" name="prime_styles.css" />
    <h:outputScript library="js" name="prime_translations.js" />
</h:head>

<h:body>
    <ui:insert name="metadata" />
    <ui:insert name="general_logged_user">
        <div align="right">
            <span style="color: #B22222; padding: 3px;"> <h:outputText
                    value="#{loggedBean._Login}" />
            </span> <span style="color: #FFA54F; padding: 3px;"> <h:outputText
                    value="Auth Method: #{loggedBean._Usuario._CUser._AuthenticationMethod}" />
            </span>
        </div>
    </ui:insert>
    <f:view locale="#{localeBean.locale}">
        <ui:insert name="general_settings">
            <f:loadBundle basename="resources.system.bundles.Messages" var="msg" />
            <p:ajaxStatus style="width:0px;height:0px;" id="ajaxStatusPanel"
                styleClass="spinner_ajax_loading">

                <f:facet name="start">
                    <h:graphicImage value="/resources/images/loading.gif" />
                </f:facet>

                <f:facet name="complete">
                    <h:outputText value="" />
                </f:facet>
            </p:ajaxStatus>
            <p:growl id="messages" autoUpdate="true" />
        </ui:insert>

        <f:event type="preRenderView"
            listener="#{navigationManagerSystem.initialize}" />


        <h:panelGroup>
            <ui:insert name="general_header">
                <ui:include src="/components/header.xhtml" />
            </ui:insert>
            <h:panelGroup id="menuNavegacionPanel">

                <h:form>
                    <h:panelGroup id="navigationPanel"
                        rendered="#{navigationManagerSystem._ShowNavegacion}">
                        <h:panelGroup
                            rendered="#{!navigationManager._DisableNavigationButtons}">
                            <p:toolbar>
                                <p:toolbarGroup>
                                    <ui:repeat value="#{navigationManagerSystem._Navegables}"
                                        var="item">
                                        <p:button value="#{item._Title}"
                                            outcome="#{item._NavigationResult}">
                                            <f:param name="NavIndex" value="#{item._QueueIndex}" />
                                        </p:button>
                                    </ui:repeat>
                                    <p:button disabled="true"
                                        value="#{navigationManagerSystem._Navegable._Title}" />
                                </p:toolbarGroup>
                            </p:toolbar>
                        </h:panelGroup>

                    </h:panelGroup>
                </h:form>
            </h:panelGroup>
            <ui:insert name="general_content">
                <ui:include src="/system/content.xhtml" />
            </ui:insert>

        </h:panelGroup>
        <ui:insert name="general_footer">

            <ui:include src="/components/general_footer.xhtml" />

        </ui:insert>
    </f:view>

</h:body>

这样,当我上传文件时,bean 就会被重建,并且listener方法未被调用。我已将过滤器放入我的web.xml。另外,如果我更改表单并将其设置为enctype="multipart/form-data",正如我在文档中读到的,我无法避免这个问题,并且 bean 会再次重建,在这种情况下,即使我单击取消按钮也是如此。这是我的 bean 代码,其中SystemNavegable是一个抽象类:

@SuppressWarnings("serial")
@ManagedBean
@ViewScoped
public class NavegableMassiveUserAdd extends SystemNavegable {

/**
 * Field logger.
 */
protected final Log logger = LogFactory.getLog(this.getClass());

/**
 * Constructor for NavegableMassiveUserAdd.
 */
public NavegableMassiveUserAdd() {
    super();
    this.set_Title(FacesUtils.getBundle(BundleNames.BUNDLE_SYSTEM_MENU,
            BundleKeys.SYSTEM_NAVEGABLE_ADD_USERS, "Añadir usuarios"));
    this.set_TitleDescription(FacesUtils.getBundle(BundleNames.BUNDLE_SYSTEM_MENU,
            BundleKeys.SYSTEM_NAVEGABLE_ADD_USERS_DESCRIPTION, "Añadir usuarios"));
    this.set_NavigationResult(NavigationResults.MASSIVE_USER_ADD);
    this._Behaviour = NavegableBehaviour.ADD;
}
/**
 * Method actionCancelAdd.
 * 
 * @return
 */
public String actionCancelAdd() {
    return this._NavigationManagerSystem.cancelNavegable();
}

/**
 * Escuchador del evento Upload.
 * 
 * 
 * 
 * @param event
 *            FileUploadEvent
 * @throws IOException
 * @throws java.io.IOException
 */
public void listener(FileUploadEvent event) throws IOException {
    UploadedFile uploadItem = event.getFile();
    //More code
    }

有什么建议吗?提前致谢。

EDITED

完成更多测试后,我发现文件上传侦听器方法永远不会到达,无论我为支持 bean 提供哪个范围,都没有关系。我有以下依赖项:

<dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.2.1</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.3.2</version>
    </dependency>

我怀疑问题可能是另一个过滤器与我用于上传组件的过滤器冲突,正如这里所说。无论问题是什么,当文件上传时,我的 bean 的初始化方法会被再次调用FacesContext.getCurrentInstance().isPostback()带有假的。


经过几次集思广益,我发现是过滤器的问题。由于上传过滤器冲突漂亮面孔过滤器,我必须将其添加到我的web.xml:

<filter-mapping>
   <filter-name>PrimeFaces FileUpload Filter</filter-name>
   <servlet-name>Faces Servlet</servlet-name>
   <dispatcher>FORWARD</dispatcher>
</filter-mapping>

非常感谢@Reinaldo de Carvalho 的回复

https://stackoverflow.com/a/9086137/1199132

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 PrettyFaces 调用 FileUploadListener 时重建 ViewScoped bean 的相关文章

随机推荐

  • Android 状态栏动画

    我是 Android 新手 我想做一个电池充电动画例如 在手机中 屏幕右上角的小图标在充电时会上下移动 并在当前电池百分比处停止 到目前为止 在我的代码中 我已经能够让它移动 但它永远不会停止 我想要的是动画在未充电时停止或以当前电池百分比
  • React refs 如何使用,何时使用?

    您好 感谢您阅读这个问题 我已经学习 React 几个星期了 我很难理解 refs 如何获取 React 的实例并将其放入 JS 变量中 例如 我们可以讨论文档的示例 class CustomTextInput extends React
  • 如何在Intellij Idea上导入滑动菜单?

    我正在使用intellij idea 如您所知 导入滑动菜单当你在 Eclipse 上运行时 将 lib 添加到你的全新项目中是很痛苦的 我做过一次 但我不再使用 intellij idea 我想知道是否有人知道如何在使用 Intellij
  • 在 R 中以全球视角绘制地理数据

    如何 是否可以在具有 d3 透视视图的地球上绘制地理数据 例如多边形层 类似于这个图形在维基百科上 我想要一个解决方案sf and ggplot大多数 但欢迎任何解决方案 我问这个主要是出于好奇 但由于我经常看到这样的图形 我想这个问题可能
  • Google API V3 多个信息窗口以及点击关闭

    我想出了如何使用多个带有信息窗口的标记 但当您单击另一个标记时它们不会关闭 我相信这是因为我正在为每个标记创建一个新的信息窗口 任何帮助将不胜感激
  • 显示自定义多个引脚显示位置错误的引脚

    这个问题已经困扰我好几个星期了 我有一个标签栏应用程序 在一个选项卡上 我输入点 在另一个选项卡上 这些点显示在地图上 引脚应该根据点的类型而不同 我面临的问题是 每次我从一个选项卡切换到另一个选项卡时 图钉图像都会从应有的图像更改为其他图
  • 在perl中获取数组中的多个值

    我正在编写一个 prel 程序 其中有一个包含以下模式的输入文件 FIELDS 1 2 3 4 OR FIELDS 1 10 3 A 11 10 7 D 9 10 11 A 值的数量不是恒定的 而是以 4 个为一组 可能有 4 8 12 1
  • Django - TemplateView 和 POST

    我有一个由 TemplateView 生成并包含 POST 表单的页面 我如何将此表单与 TemplateView 一起使用 有一个与我的代码类似的示例 class ProjetMixin object def get context da
  • 在 XML 上应用 XSLT v.2

    我编写了一个 XSLT 2 0 版本文件 当它应用于 XML 文件时 出现以下错误 ERROR Unsupported XSL element http www w3 org 1999 XSL Transform sequence 这是Ja
  • Firebase存储读取安全规则似乎没有任何效果

    我正在努力为 Firebase 存储设置安全规则 但读取规则似乎没有任何效果 rules version 2 service firebase storage match b bucket o match allPaths allow re
  • 防止在门控签入构建中释放触发器

    如何停止不产生任何工件的门控签入构建上的发布触发器 我有一个启用了门控签入的构建定义 在发布和发布工件步骤中 我将条件设置如下 ne 变量 Build Reason CheckInShelveset 这意味着 如果构建是由门控签入触发的 则
  • Laravel - 数据透视表上的附加关系

    我有一个带 2 个键的常规数据透视表 但是 我还有第三列 我想在其中存储具有一对多关系的不同密钥 这可能有吗 Example 数据透视表 组织1 组织2 关系类型1 2 11 3 2 在本例中 组织编号 1 与组织编号 2 存在关系 关系类
  • 如何使用 Fluent API 添加所有者属性的等效项?

    如果不使用 TrackState 上的属性或为发布者 文章指定 OwnsOne 我似乎无法执行此操作 有什么方法可以在不使用属性的情况下将 TrackState 全局标记为自有类型吗 对于通过 google 访问的人 如何使用 Fluent
  • com.mysql.jdbc.ConnectionImpl.getServerCharset(ConnectionImpl.java:3005) 处的 java.lang.NullPointerException

    我今天转移到 macOS 并重新创建了一个非常简单的数据库测试项目来检查我的 mySQL 连接 但我收到 SQL 异常 无法创建与数据库服务器的连接 这是完整的日志 https pastebin com iZrktVKn 我实际上复制了我在
  • 我可以在Maya、Blender中导入tensorflow和keras吗

    我正在参加一个研讨会 我们需要自动装备角色 也许 我们会使用深度学习的方法 任务是识别身体部位 我的问题 有没有办法将 TensorFlow 和 keras 或其他神经网络与 3D 软件连接起来 对于搅拌机 您可以按照本教程进行操作 htt
  • jQuery UI - 滑块 - 如何添加值

    fiddle 我有一套价值观 是否可以在不破坏和重建幻灯片实例的情况下添加新句柄或删除其中一些句柄 就像是 slider slider addValueAt 5 或删除 新值不能等于任何实际值 因此不得超过 12 个值 我已经得到了它的自定
  • Celery工人导入错误:没有名为“项目”的模块

    当我尝试启动工作人员时 我遇到了一个问题 导入错误 没有名为 项目 的模块 回溯 最近一次调用最后一次 File usr local bin celery line 11 in
  • 根据未来结果排序

    我试图按未来布尔值对列表进行排序 我有一个 ID 列表 我需要查询外部服务以查明它们背后是否有上下文信息 我用来执行此操作的方法返回一个可选的 future 通过使用分区方法 我希望创建两个 ID 列表 一个包含上下文信息 另一个不包含上下
  • 按前缀过滤数组的本机函数

    假设我有一个包含以下成员的数组 car porsche car mercedes car toyota motorcycle suzuki motorcycle honda motorcycle motoguzzi 如何获得一个包含所有元素
  • 使用 PrettyFaces 调用 FileUploadListener 时重建 ViewScoped bean

    我已经插入了一个