index.xhtmlに次のように2つのSelectOneMenuがあります。menu1 は基本的に言語 (sp または en) を選択し、menu2 は可能なシリアル番号 (0 から 3) を表示します。2 つのメニューのデフォルト値を初期化する init コンストラクター (ポスト コンストラクター) があります。ただし、奇妙な理由で、デフォルトの言語以外の言語のデフォルトのシリアル番号以外のシリアル番号を選択すると、どういうわけか言語が初期化デフォルトにリセットされます:(
<?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">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>My page</title>
</h:head>
<h:body>
<div>
<h4>Change Existing Description</h4>
</div>
<h:form id="myForm">
<h:panelGrid columns="4">
<h:outputLabel value="Language:" />
<h:selectOneMenu value="#{myBean.language}">
<f:selectItems value="#{myBean.languages}" />
<f:ajax listener="#{myBean.doUpdate}" render ="myForm" />
</h:selectOneMenu>
<h:outputLabel value="SerialID:" />
<h:selectOneMenu value="#{myBean.serialID}">
<f:selectItems value="#{myBean.serialIDs}" />
<f:ajax listener="#{myBean.doUpdate}" render ="myForm" />
</h:selectOneMenu>
</h:panelGrid>
</h:form>
</h:body>
</html>
これが私のBeanコードです。問題はどこだ??お知らせ下さい!
package bean;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.Stateful;
import javax.enterprise.context.RequestScoped;
import javax.faces.bean.ManagedBean;
@ManagedBean(name = "myBean")
//@Stateless
@Stateful
@RequestScoped
public class MyBean {
public static final int PERMISSIONS = 2;
private List<String> languages;
private String language;
private int serialID;
private List<Integer> serialIDs;
/**
* init() method for initializing the bean. Is called after constuction.
*/
@PostConstruct
private void init() {
//public MyBean () {
languages = getAllLanguages();
language = "en"; //defaultLanguage
serialID = 3;
serialIDs = getSerialIDsFromOverview();
}
public List<String> getLanguages() {
System.out.println("getLanguages, language " +language);
return languages;
}
public int getPERMISSIONS() {
return PERMISSIONS;
}
public String getLanguage() {
System.out.println("getLanguage " +language);
return language;
}
public void setLanguage(String language) {
System.out.println("setLanguage " +language);
this.language = language;
}
public int getSerialID() {
System.out.println("getSerialID " +serialID);
return serialID;
}
public void setSerialID(int serialID) {
System.out.println("setSerialID " +serialID);
this.serialID = serialID;
}
public List<Integer> getSerialIDs() {
System.out.println("getSerialIDs language = "+language );
return serialIDs;
}
public List<String> getAllLanguages() {
List<String> results = new ArrayList<String>();
results.add("sp");
results.add("en");
if(results != null){
System.out.println("getting all languages");
}
return results;
}
public void doUpdate() {
System.out.println("doUpdate language " +language);
System.out.println("doUpdate serialID " +serialID);
}
/**
* Returns a list of all serialIDs present in the overview.
* @return
*/
private List<Integer> getSerialIDsFromOverview() {
List<Integer> results = new ArrayList<Integer>();
results.add(0);
results.add(1);
results.add(2);
results.add(3);
return results;
}
}
更新:
cubbukからの提案を受けた後、@ViewScoped アノテーションを付けてコードを修正し、Bean に Serializable を実装しました。これは機能します。ただし、次にやらなければならなかったことは、@EJB アノテーションを含めてステートレス Bean を呼び出すことでした。この Bean は、エンティティ マネージャーを呼び出して、シリアル ID を "ハードコーディング" する代わりにデータベースから取得します。それは私が問題に遭遇したときです: Not serializable exception " java.io.NotSerializableException: bean.__EJB31_Generated__ .これを解決するにはどうすればよいですか? myBean を RequestScope に戻し、Serializable を削除すると、問題なくコードを実行できましたが、トグル値を初期化するメニューの:(
ちなみに、私はこの投稿をチェックしています: @ViewScoped マネージド Bean の @EJB は java.io.NotSerializableExceptionを引き起こし、状態保存メソッドをサーバーに設定しますが、「サーバーからの空の応答」ポップアップ メッセージが表示されます :( 助けてください!