每次请求都会调用@ViewScoped的@PostConstruct

时间:2014-08-23 13:18:00

标签: jsf view-scope postconstruct

我在JSF 2.2.7和Primefaces 5中打开对话框时出现问题。我已经有按钮打开一个对话框,每次单击按钮@PostConstruct方法时都会出现问题。为什么?

我只想调用@PostConstruct一次,但我不想将范围更改为Session(使用@SessionScope注释它可以完美地工作)。

这是我的观点:

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

<h:head>

</h:head>
<h:body>
    <h:form id="f1">
        <p:dialog widgetVar="trainingDialog2" id="d1">
            <h:outputText value="#{userViewBean.errorMessage}" />
        </p:dialog>
        <br />

        <p:dataTable id="dt1" value="#{userViewBean.infoList}" var="item">
            <p:column>
                <p:commandButton id="btn" update=":f1:d1"
                    oncomplete="PF('trainingDialog2').show()"
                    styleClass="ui-icon ui-icon-calendar">
                    <f:setPropertyActionListener value="#{item.id}"
                        target="#{userViewBean.errorMessage}" />
                </p:commandButton>
            </p:column>
        </p:dataTable>
    </h:form>
</h:body>
</html>

这是我的豆子:

package pl.jrola.java.www.vigym.viewcontroller.beans.userview;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.view.ViewScoped;

@ManagedBean(name = "userViewBean")
@ViewScoped
public class UserViewBean implements Serializable {

    private static final long serialVersionUID = 6994205182090669165L;

    private String errorMessage;

    private List<UserProfileInfoBean> infoList;

    public List<UserProfileInfoBean> getInfoList() {
        return infoList;
    }

    public void setInfoList(List<UserProfileInfoBean> infoList) {
        this.infoList = infoList;
    }


    public UserViewBean() {

    }

    @PostConstruct
    public void postConstruct() {
        this.infoList = new ArrayList<UserProfileInfoBean>();
        for (long i = 0; i < 3; i++) {
            this.infoList.add(new UserProfileInfoBean(i));
        }

    }


    public String getErrorMessage() {
        return errorMessage;
    }

    public void setErrorMessage(String errorMessage) {
        this.errorMessage = errorMessage;
    }


}

1 个答案:

答案 0 :(得分:5)

您正在混合JSF bean和CDI bean的注释,有效地使bean成为@RequestScoped,因为它是@ManagedBean的默认值。

如果您使用JSF bean,请使用:

javax.faces.bean.ManagedBean;
javax.faces.bean.ViewScoped;

如果您想使用CDI bean,请使用:

javax.inject.Named;
javax.faces.view.ViewScoped;

如果您的服务器支持CDI,您应该选择CDI bean。

在此处阅读有关默认范围的更多信息: What is the default Managed Bean Scope in a JSF 2 application?