首次请求后,CDI SessionBean不存在

时间:2013-10-31 15:16:03

标签: java java-ee jsf-2 cdi glassfish-4

我使用JSF 2和GlassFish Server 4与CDI(导入javax.enterprise.context ...)。我试图将SessionBean A注入另一个SessionBean,B,但是当我尝试在第二个http请求上访问B时,它不再存在。而是创建一个新的B实例。因此,任何bean都没有信息。以下是我的一些代码:

Bean A :(此bean保留所有登录信息)

@Named("login")
@SessionScoped
public class LoginBean implements Serializable {

    private Farmer aFarmer;
    private Admin anAdmin;
    private User loginInfo;
    private int tries;
    private boolean loggedIn;
    private int accessLvl;

    /**
     * Constructor for a LoginBean, setting default values
     */
    public LoginBean() {

    }

    @PostConstruct
    public void init() {
        loginInfo = new User();
        tries = 0;
        loggedIn = false;
    }

Bean B :(这个bean保存所有农民信息,用于对农民采取行动)

@Named("farmer")
@SessionScoped
public class FarmerController implements Serializable{

    private @Inject LoginBean login;
    private Farmer theFarmer;
    private ArrayList<Integer> dates;
    private ArrayList<Integer> months;
    private ArrayList<Integer> years;
    private int date; //date place holder
    private int month; //month place holder
    private int year; //year place holder
    private String response; //confirmation response
    private String confPwd;
    private String oldPwd;
    private String email;
    private String password;

    /**
     * Default constructor for FarmerController, sets standard calendar values
     */
    public FarmerController() {

    }

    @PostConstruct
    public void init() {
        theFarmer = new Farmer();

        //standard values for dates
        dates = new ArrayList<>();
        for (int i = 0; i < 31; i++) {
            dates.add(i+1);
        }
        //standard values for months
        months = new ArrayList<>();
        for (int i = 0; i < 12; i++) {
            months.add(i+1);
        }
        //standard values for year, current year - 100
        Calendar cal = new GregorianCalendar();
        int tempyear = cal.get(Calendar.YEAR);
        years = new ArrayList<>();
        for (int i = 0, j = tempyear; i < 100 && j > tempyear - 100; i++, j--) {
            years.add(j);
        }

        //check when bean is constructed
        System.out.println("FarmerController constructed");
    }

index.xhtml :(这是我登录的地方,这很好用)

<h:form class="form-horizontal form-group">
     <fieldset>
          <div class="input-group">
               <h:inputText id="username" class="form-control" p:placeholder="Brukernavn/Email" value="#{farmer.email}"/>
          </div>
          <div class="input-group">
               <h:inputSecret id="password" class="form-control" p:placeholder="Passord" value="#{farmer.password}"/>
          </div>
          <div class="input-group">
               <h:commandButton id="signin" value="Logg inn" class="btn btn-success" action="#{farmer.login()}"/>
          </div>
     </fieldset>
</h:form>

登录后,我登陆第二个.xhtml页面,正确显示所有内容。但是,当我进一步导航到另一个引用此FarmerController的页面时,它会创建一个新的bean,它没有登录的任何信息。为什么会发生这种情况?我做错了什么?

更新:我还尝试合并两个bean(对所有操作只使用1个),我遇到了同样的问题,即登录后SessionScoped bean被破坏了。

1 个答案:

答案 0 :(得分:1)

经过多次调试后我终于找到了错误。它与注入bean没有任何关系,而是在渲染过程中调用了带有注销方法的<a>标记,因为我没有将commandLink操作属性一起使用。我想<a>标签中的 href属性想要立即获得其结果字符串,从而运行我在标签中的方法。现在我知道了。愚蠢的错误......