【问题标题】:ViewScoped Constructor being called before save method in JSF 2.1.16在 JSF 2.1.16 中的保存方法之前调用 ViewScoped 构造函数
【发布时间】:2012-12-22 01:11:07
【问题描述】:

关于我的 JSF 应用程序,我注意到 Mojarra JSF 2.1.16 库存在问题。我有一个ViewScoped bean,它从作为 ViewParam 的登录中加载用户。之后,可以管理和保存加载的用户数据。下面是视图代码,我已经跳过了主要的表单字段,因为我已经测试过它们没有问题。

    <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="user" name="user"
            value="#{manager._ParamUser}" />
        <f:event type="preRenderView"
            listener="#{manager.initialize}" />
    </f:metadata>
</ui:define>

<ui:define name="general_content">
    <p:outputPanel autoUpdate="false" id="loggedData" name="loggedData"
        layout="block">
        <h:form id="SystemUserForm">

            <h:panelGrid columns="4" cellspacing="10px" style="border-color:red;">
                <h:outputText value="#{msg.LOGIN}:" />
                <h:outputText value="#{manager._UserBean._login}" />
            </h:panelGrid>
            <p:commandButton value="#{msg.UPDATE}" action="#{manager.actionSave}"
    ajax="false" />

            <p:commandButton value="#{msg.CANCEL}"
    action="#{manager.actionCancelSave}" ajax="false" />
        </h:form>
    </p:outputPanel>
</ui:define>

在开始时创建 bean 并使用接收到的参数从数据库加载用户本身。当我调用操作方法来保存它时,问题就来了,因为正在再次构造名为 managerViewScoped bean。所以没有参数,我有一个空指针异常。这与 Mojarra 2.1.142.1.15 一起正常工作。

支持 bean 代码:

@ManagedBean
@ViewScoped
public class Manager extends UserData {

public static final String PARAM_USER = "ParamUser";

private String _ParamUser;

public String get_ParamUser() {
    return this._ParamUser;
}

public void set_ParamUser(String _ParamUser) {
    this._ParamUser = _ParamUser;
}

public Manager() {
    super();
}

@Override
public void initialize(ComponentSystemEvent event) {
    if (!FacesContext.getCurrentInstance().isPostback()) {
        loadUserBean(this._ParamUser);
        if (this._UserBean == null) {
            redirectTo404();
        }
    }
}

@Override
public String actionSave() {
    super.actionSave();
    return NavigationResults.USER_LIST;
}

UserData 当然是一个抽象类。当actionSave() 被调用时,bean 被再次构造,并且没有_ParamUser 属性,因为这是通过viewParam 获取的。构造函数召回只发生在 Mojarra 2.1.6 中。

【问题讨论】:

  • 无法重现您的问题。请提供 SSCCE。
  • 已编辑。我尽量说清楚。
  • 假设/templates/general_template.xhtml 不包含bean 引用,我仍然看不到问题。请注意,#{manager} 在请求页面时根本没有构造,因为它没有被某些输出组件或事件引用。所以它只在提交表单时构建。也许这让你感到困惑?
  • 等等,你的Manager 类有一个NavigableUserData 构造函数?你贴出真实的代码吗?或者至少复制粘贴测试代码?
  • 对不起,为了更好理解,我改了一些名字..

标签: java jsf-2 mojarra


【解决方案1】:

此问题已在 Mojarra JSF 2.1.17 中得到解决,经过尝试和测试。 Mojarra JSF 2.1.16Tomcat 6 可能有问题。但是,我没有找到该版本的任何known issues

【讨论】:

    猜你喜欢
    • 2015-08-20
    • 2021-08-21
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    相关资源
    最近更新 更多