4

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;
    }
4

1 に答える 1