2

JSFプロジェクトでは、文字列値のリストが入力され、整数値「yearStart」に接続されたSelectOneMenuがあります。リストから値を選択すると、コンバーターは常にコンソールに「stringVal=null」を出力します。選択したアイテムの値がコンバーターに到達しないのはなぜですか?

私のWebページには次のものが含まれています。

<h:selectOneMenu value="#{applicantController.yearStart}">
    <f:selectItems value="#{yearList.years}" />
    <f:converter converterId="studyYearConverter"/>
</h:selectOneMenu>

次の年のリストを使用します。

@ManagedBean
@ApplicationScoped
public class YearList implements Serializable {

    private static final long serialVersionUID = 1L;

    private final List<String> years = Arrays.asList("prior to 1990", "1990",
        "1991", "1992", "1993", "1994", "1995", "1996", "1997", "1998",
        "1999", "2000", "2001", "2002", "2003", "2004", "2005", "2006",
        "2007", "2008", "2009", "2010", "2011", "2012", "2013");

    public List<String> getYears() {
        return years;
    }

}

私のコンバータークラス:

@FacesConverter(value = "studyYearConverter")
public class StudyYearConverter implements Converter {

    private static final String PRIOR_TO_1990 = "prior to 1990";

    @Override
    public Object getAsObject(FacesContext context, UIComponent component,
            String stringVal) {
        if (PRIOR_TO_1990.equals(stringVal)) {
            return -1;
        } else {
            System.out.println("stringVal = " + stringVal);  
            // Why is this alway null??
            try {
                return Integer.parseInt(stringVal);
            } catch (NumberFormatException pe) {
                FacesMessage message = new FacesMessage(
                       "Invalid date format. Valid format e.g. 2010-04");
                throw new ConverterException(message);
            }
        }
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component,
        Object value) {
        if (value == null || !(value instanceof Integer)) {
                return null;
        } else {
            Integer year = (Integer) value;
            if (year == -1) {
                return PRIOR_TO_1990;
            } else {
                return year.toString();
            }
        }
    }
}
4

2 に答える 2

0

コンバーターが期待するアイテムを提供していません。

このgetAsString()メソッドは、HTML応答のレンダリング中に使用されます。この時点で、(おそらく)複雑なJavaオブジェクトをString、HTMLで表現できるように、固有の表現に変換する必要があります。このgetAsObject()メソッドは、HTTPリクエストパラメータ値を適用するときに使用されます。HTTPリクエストパラメータ値は、HTML入力値をString次のように表すことができます。複雑なJavaオブジェクトを元に戻すには、一意のString表現を変換する必要があります。

List<String>利用可能なアイテムの値があります。したがって、すべてのアイテムがHTMLにレンダリングされようとしているとき、それはを通過しgetAsString()ます。instanceof Integerただし、チェックを実行しているため、常に失敗するnullため、すべてのアイテムが返されます。したがって<option>、生成されたHTMLには価値がなく、として送信されnullます。だからあなたはsgetAsObject()を取得することになりますnull

これまでの試みを踏まえると、#{applicantController.yearStart}実際にIntegerは年で設定したい、または-1「1990年以前」を選択した場合の印象があります。コンバーターを保持したい場合は、利用可能なアイテムを次のように変更する必要があります

private final List<Integer> years = Arrays.asList(-1, 1990,
        1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
        1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
        2007, 2008, 2009, 2010, 2011, 2012, 2013);
于 2013-02-11T12:50:39.737 に答える
-1

どちらが解決策になるかはわかっています。リストと選択した要素をプロパティに保存し、コンポーネントが使用されている限り、それらをスコープ内に維持する必要があります。

于 2013-08-29T14:20:28.043 に答える