【问题标题】:Is it possible to inject a view scoped bean into a @FacesValidator in JSF?是否可以将视图范围的 bean 注入 JSF 中的 @FacesValidator 中?
【发布时间】:2014-05-28 23:53:23
【问题描述】:

正如标题所暗示的,我正在尝试将视图范围的 bean 注入到由@FacesValidator 修饰的验证器中,如下所示。

@FacesValidator(value = "priceRangeValidator")
public final class PriceRangeValidator implements Validator {
    @ManagedProperty(value="#{rangeSliderBean}")
    private RangeSliderBean rangeSliderBean; //Setter only.

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        // The bean instance is unavailable here. It is null.
    }
}

目标视图范围 bean - RangeSliderBeanvalidate() 方法中不可用。


我暂时按照以下方式在validate()方法本身中获取该bean的实例。

RangeSliderBean rangeSliderBean = context.getApplication().evaluateExpressionGet(context, "#{rangeSliderBean}", RangeSliderBean.class);

是否可以使用@ManagedProperty 注释或其他方式将视图范围的 JSF 托管 bean 注入验证器?

我使用的是 JSF 2.2.6。


更新:

这不适用于Mojarra 2.3.0-m01。 bean 实例仍然像以前一样保持null。这一次在这篇文章之后很久,我拿了一个对应的视图范围 CDI bean(@ManagedProperty@Inject 替换)。

【问题讨论】:

    标签: jsf validation jsf-2.2


    【解决方案1】:

    通过像这样使用Application 评估表达式来尝试动态注入。

    FacesContext facesContext = FacesContext.getCurrentInstance();
    RangeSliderBean rangeSliderBean = facesContext.getApplication().evaluateExpressionGet(facesContext, "#{rangeSliderBean}", RangeSliderBean .class);
    

    【讨论】:

    • 在 JSF 2.2 中,@ManagedProperty@EJB 等注释应该适用于 @FacesValidator@FacesConverter。同样在这种情况下,即使我用 @ManagedBean 使用所需/必需的范围装饰验证器,它也不起作用。
    • 小小,JSF 2.2 的说法不正确。这在showcase.omnifaces.org/cdi/FacesValidator 中有解释
    猜你喜欢
    • 2013-12-12
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 2012-10-11
    • 2016-11-13
    相关资源
    最近更新 更多