验证f:viewParam值是一组选定的允许值之一

时间:2015-04-14 18:06:10

标签: validation jsf jsf-2 viewparams

我正在学习JSF 2.2,我在找到一个很好的答案时遇到了一些麻烦,我可以理解如何在GET参数上进行更多验证。

我有一个source.xhtml文件,其链接如下:

<h:link value="ALTER" outcome="/main/showSqlTemplates.xhtml">
    <f:param name="type" value="ALTER" />
</h:link>

在我的destination.xhtml中,我的代码如下:

<f:metadata>
<f:viewParam id="type" name="type" value="#{showSqlTemplateManagedBean.type}" required="true" requiredMessage="Invalid page access. Please use a link from the menu."/>                    
</f:metadata>
<h:message for="type" class="bold"></h:message>
<br/>TYPE is : #{showSqlTemplateManagedBean.type}

我的bean类看起来像这样:

@ManagedBean
@RequestScoped
public class ShowSqlTemplateManagedBean {

    String type = "";

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public ShowSqlTemplateManagedBean() {

    }
}

你可以看到我使用了&#34; required&#34;属性,以确保类型参数至少在那里,一切都工作得很好。但我想做更多的验证。

具体来说,我想确保String类型的值只是ALTER,INSERT,UPDATE或DELETE。

这是自定义验证器的来源吗?对于这种简单的验证检查,自定义验证器似乎过度杀死。我相信我错过了一些东西。也许在PostConstruct的init()方法中加入一些东西?

1 个答案:

答案 0 :(得分:3)

只需将其设为enum

@ManagedBean
@RequestScoped
public class ShowSqlTemplateManagedBean {

    public enum Type {
        ALTER, INSERT, UPDATE, DELETE;
    }   

    private Type type;

    public Type getType() {
        return type;
    }

    public void setType(Type type) {
        this.type = type;
    }

}

JSF有一个用于列的内置转换器,它将完全透明地启动。任何无效值都会导致转化错误,您可以通过converterMessage的{​​{1}}属性进行自定义。

Enums在代码的其他地方也有更多的好处。


对具体问题

无关,用空字符串(甚至是<f:viewParam>)显式初始化属性是不好的做法。不要那样做了。此外,使用非空字符串或非空字符初始化托管bean属性应该在null带注释的方法中进行。