0

「カスタム軽量」JSFコンポーネントバインディングを実行しようとしています。私のBean(一部のJSFページを制御する)では、HahsMapを宣言しています。ここで、h:inputTextID(ページに表示される)にまたがるキーがこれらのIDをカスタムHInputText<T>オブジェクトにマップします(T以下の例ではLongです)。次に、HInputText<T>オブジェクトを使用して、対応するh:inputText属性のサブセットを保持しています。valueタイプは、、、などであると想定されていTますrenderedrequiredこの方向では、HInputText<T>オブジェクトのフィールドがh:inputText属性に値を与えます。

私の問題は、このようなh:inputText内部を使用するh:formと、JSF検証が行われないことです。(Long値を保持すると想定される)英数字を入力できh:inputText、フォームはエラーを表示せずに送信されます。属性は正しく管理されていることrequiredに注意してください( trueに設定されているため、フィールドを空のままにするとエラーが発生します)。また、英数字を使用してページのの値を表示しようとすると、表示されます。renderedrequiredh:inputTexth:inputTexth:outputText

それぞれにカスタムバリデーターを明示的に定義することなく、JSF検証を機能させるためのトリックはありますh:inputTextか?

HInputText.class:

public class HInputText<T>
{
    private String id;
    private boolean rendered;
    private boolean required;
    private T value;
    private Class<T> myClass;

    // getters and setters for all fields

    public HInputText(Class<T> myClass, String id)
    {
        this.myClass = myClass;
        this.id = id;
        this.rendered = true;
        this.required = true;
    }
}

マネージドBeanのコードスニペット:

@ManagedBean(name="saisieController")
@SessionScoped
public class SaisieController
{
    ...
    private HashMap<String,HInputText<Long>> htagLongInputTexts;

    public HashMap<String, HInputText<Long>> getHtagLongInputTexts()
    {
        return htagLongInputTexts;
    }

    public void setHtagLongInputTexts(HashMap<String, HInputText<Long>> hLongInputTexts)
    {
        this.htagLongInputTexts = hLongInputTexts;
    }

    public void addHtagLongInputText(HInputText<Long> hLongInputText)
    {
        getHtagLongInputTexts().put(hLongInputText.getId(), hLongInputText);
    }

    public HInputText<Long> getHtagLongInputText(String hLongInputTextId)
    {
        return(getHtagLongInputTexts().get(hLongInputTextId));
    }



    @PostConstruct
    public void init()
    {
        setHtagLongInputTexts(new HashMap<String, HInputText<Long>>());
        addHtagLongInputText(new HInputText<Long>(Long.class, "HIT_LongTestHIT"));
    }

    public String doNothing()
    {
        return null;
    }
}

そして最後に私のjsfページからのスニペット:

<h:form>
    <h:inputText
        id = "HIT_LongTestHIT"
        value = "#{saisieController.htagLongInputTexts['HIT_LongTestHIT'].value}"
        rendered = "#{saisieController.htagLongInputTexts['HIT_LongTestHIT'].rendered}"
        required = "#{saisieController.htagLongInputTexts['HIT_LongTestHIT'].required}"
    />
    <h:message for = "HIT_LongTestHIT" styleClass = "error-text" />
    <h:commandButton value = "submit" action = "#{saisieController.doNothing()}" />
    <h:outputText value = "#{saisieController.htagLongInputTexts['HIT_LongTestHIT'].value}" />
</h:form>
4

1 に答える 1

0

各 h:inputText に対してカスタム Validator を明示的に定義しなくても、JSF 検証を機能させるためのトリックはありますか?

いいえ、それは不可能です。型消去のため、ジェネリック型情報は実行時に利用できません。JSF/EL は、それTが実際にはLongある Tとは認識していません。LongConverterこの特定の例では、コンバータ ID が であるコンバータを明示的に指定する必要がありますjavax.faces.Long

<h:inputText ... converter="javax.faces.Long">

または、必要に応じて動的に

<h:inputText ...>
    <f:converter converterId="#{saisieController.htagLongInputTexts['HIT_LongTestHIT'].converterId}" />
</h:inputText>

利用可能なすべての標準 JSF コンバーターの概要は、javax.faces.convertパッケージの概要で確認できます。public constant の定数フィールド値リンクに移動すると、コンバーター ID を確認できますCONVERTER_ID

于 2013-01-10T14:30:17.867 に答える