Mojarra の JSF 2.4 で奇妙な動作に遭遇しました。ページから別のページに渡すためにフラッシュパラメーターを使用しています。新しいページに到達するたびに、Postconstruct アノテーション付きメソッドでフラッシュ パラメータを取得します。次に、ページが更新されると、ユーザーは別のページにリダイレクトされます。(リフレッシュ後にフラッシュパラメータが消去されるため)。
同じコードの場合、別のデータ (ハードコードまたはデータベース クエリ) から selectItems を入力すると、このエラー i が発生します。
JSF1095: フラッシュの発信 Cookie を設定しようとした時点で、応答はすでにコミットされていました。フラッシュに保存された値は、次のリクエストでは使用できません。
私はこれに乗りたいのですが、おそらく何か関係があります:
facesContext.responseComplete();
facesContext.renderResponse()
使い方がわかりません。
私は約2を読んだ:
<h:selectOneMenu id ="loc" value="#{participantController.localisation}"
validatorMessage="Vous devez renseigner la localisation." >
<f:selectItems value="#{participantController.locFeaturesList}"
var="locFeature" itemLabel="#{locFeature.locName}"
itemValue="#{locFeature.locName}" />
</h:selectOneMenu>
私のリストオブジェクト:
public static class LocFeatures{
public String locName;
public String codeName;
public LocFeatures(String locName, String codeName){
this.locName = locName;
this.codeName = codeName;
}
public String getLocName(){
return locName;
}
public String getCodeName(){
return codeName;
}
}
リストオブジェクトにデータを入れます:
public LocFeatures[] loadLocalisationpAdicapCodeAssociativeMenu() {
List <Static> loc2Code = staticBo.get(STATIC_CATEGORY_PARTICIPANT_LOCALISATION_CODE);
locFeaturesList = new LocFeatures[loc2Code.size()+1];
// if I populate my list with only some values no errors will be thrown but it doesn't work when i populate it by a big database request
//locFeaturesList = new LocFeatures[1];
locFeaturesList[0] = new LocFeatures("-----",null); // Associations Classe - Name
int indice = 1;
for (Static assocation : loc2Code) {
locFeaturesList[indice] = new LocFeatures(assocation.getKey(),assocation.getValue()); // Associations Classe - Name
indice ++;
}
return locFeaturesList;
}
私の @PostConstruct メソッド:
@PostConstruct
public void setFlashParam() {
//locFeaturesList = loadLocalisationpAdicapCodeAssociativeMenu();
FacesContext facesContext = FacesContext.getCurrentInstance();
String studyNameFlashed = (String) facesContext.getExternalContext().getFlash().get("study_name");
// Gere un refresh qui ferait disparaitre le type de l'étude.
if (studyNameFlashed == null) {
try { ExternalContext ec = facesContext.getExternalContext(); ec.redirect(ec.getRequestContextPath() + "/Accueil"); } catch (IOException e) {e.printStackTrace();}
return;
}
return;
}