Проверьте, чтобы значение f:viewParam было одним из выбранного набора допустимых значений.

Я изучаю 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}

и мой класс бобов выглядит так:

@ManagedBean
@RequestScoped
public class ShowSqlTemplateManagedBean {

    String type = "";

    public String getType() {
        return type;
    }

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

    public ShowSqlTemplateManagedBean() {

    }
}

как вы можете видеть, я использовал атрибут "required", чтобы убедиться, что параметр type хотя бы есть, и все работает нормально, насколько это возможно. Но я хотел бы сделать больше проверки.

В частности, я хочу убедиться, что значение типа String будет только ALTER,INSERT,UPDATE OR DELETE.

Это где пользовательский валидатор приходит? Пользовательский валидатор кажется слишком сложным для такой простой проверки. Я уверен, что что-то упустил. Может быть, положить что-то в методе PostConstruct init()?

1 ответ

Решение

Просто сделай это 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 атрибут <f:viewParam>,

Enums также имеют больше преимуществ в других частях кода.


Не имеет отношения к конкретной проблеме, явно инициализируя свойства пустой строкой (или даже null) это плохая практика. Не делай этого больше. Более того, инициализация свойств управляемого компонента с непустой строкой или ненулевым должна происходить в @PostConstruct аннотированный метод.

Другие вопросы по тегам