【问题标题】:Ignoring only invalid query params in JSF仅忽略 JSF 中的无效查询参数
【发布时间】:2011-11-15 16:12:01
【问题描述】:

我正在使用 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&amp;type=foo&amp;limit=10,这可以正常工作。但是,如果其中一个参数无效,例如 ?id=1&amp;type=foo&amp;limit=bar,则 id 和 type 等有效参数也会被忽略。

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

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

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

    例如

    <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;
        }
    
    }
    

    【讨论】:

    • 谢谢,我也发布了一个替代解决方案,你能看看使用这种方法是否有缺点?我基本上是在考虑为我的日期转换器做同样的事情,并且认为我不应该重写转换器代码,而应该只委托给现有的转换器。是否可以将 AOP 转换器添加到所有转换器,以便它会拦截对转换器的任何调用,并捕获异常并返回 null?我正在使用 Spring,也许可以使用 Spring AOP?
    • 我也想到了你的替代方法,但这对于简单的转换来说似乎有点过头了。您可以真正去扩展标准转换器。至于 AOP,抱歉,我没有这方面的经验,所以我不能说。
    【解决方案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;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      • 2022-11-28
      • 2021-11-04
      • 2014-11-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      相关资源
      最近更新 更多