CDIでJSF 2とGlassFish Server 4を使用しています(javax.enterprise.contextをインポートしています...)。SessionBean A を別の SessionBean B に注入しようとしていますが、2 番目の 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>
ログインすると、すべてが正しく表示されている 2 番目の .xhtml ページが表示されます。ただし、さらにこの FarmerController を参照する別のページに移動すると、ログインからの情報をまったく持たない新しい Bean が作成されます。これはなぜですか? 私は何を間違っていますか?
更新: 2 つの Bean をマージしようとしました (すべてのアクションに 1 つだけを使用)。ログイン後に SessionScoped Bean が破棄されるという同じ問題があります。