在JSF中仅忽略无效的查询参数

时间:2011-11-15 16:12:01

标签: jsf jsf-2

我正在使用f:viewparam将GET请求参数捕获到JSF页面。

<f:metadata>
    <f:viewParam name="id" value="#{mediaGroupController.mediaGroupId}"/>
    <f:viewParam name="type" value="#{mediaGroupController.type}"/>
    <f:viewParam name="limit" value="#{mediaGroupController.limit}" converter="javax.faces.Integer" >
    <f:validateLongRange minimum="0"/>
    </f:viewParam>
</f:metadata>

如果我为所有人输入有效参数,例如?id=1&type=foo&limit=10,则此工作正常。但是,如果其中一个参数无效,例如?id=1&type=foo&limit=bar,则还会忽略id和type等有效参数。

我想在这种情况下只忽略limit参数。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:4)

创建一个自定义转换器,它不会抛出ConverterException,但只在转换失败时返回null

E.g。

<f:viewParam name="limit" value="#{mediaGroupController.limit}" converter="limitConverter">

@FacesConverter("limitConverter")
public class LimitConverter {

    @Override
    public Object getAsString(FacesContext context, UIComponent component, Object value) {
        return (value != null) ? String.valueOf(value) : null;
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        return (value != null && value.matches("\\d+") ? Integer.valueOf(value) : null;
    }

}

答案 1 :(得分:2)

另一种方法可能是扩展现有的转换器,并捕获异常并在这种情况下返回null

@FacesConverter("limitConverter")
public class LimitConverter extends IntegerConverter{

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        try {
            return super.getAsString(context, component, value);
        } catch (ConverterException e) {
            return null;
        }
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        try {
            return super.getAsObject(context,component, value);
        } catch (ConverterException e) {
            return null;
        }
    }
}