0

我正在尝试做一些“自定义轻量级”JSF 组件绑定。在我的bean(控制一些JSF页面)中,我声明了一个HahsMap,其中跨越我的h:inputTextid(出现在页面中)的键将这些id映射到自定义HInputText<T>对象(T在下面给出的示例中是Long)。然后我使用HInputText<T>对象来保存相应 h:inputText 属性的子集:value应该是类型T, rendered,required等。在这个方向上,来自HInputText<T>对象的字段为属性赋予值h:inputText

我的问题是,当在h:inputText内部使用这样的 a时h:form,不会发生 JSF 验证:我可以在h:inputText(应该包含 Long 值)中键入字母数字字符,并且我的表单提交时不会显示任何错误。请注意,required属性rendered管理正确(因为required设置为 true,所以当我将该h:inputText字段留空时出现错误),并且当我尝试h:inputText使用一些h: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

是否有一些技巧可以使 JSF 验证工作而不必为每个 h:inputText 显式定义自定义验证器?

不,那是不可能的。由于类型擦除,泛型类型信息在运行时不可用。JSF/EL 不知道它T实际上是 a 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>

javax.faces.convert您可以在包摘要中找到所有可用标准 JSF 转换器的概述。您可以通过导航到公共常量上的常量字段值链接来查找它们的转换器 ID CONVERTER_ID

于 2013-01-10T14:30:17.867 回答