【发布时间】:2015-07-13 17:23:33
【问题描述】:
@FacesConverter 和 @FacesValidator 不符合 EJB 或最高 JSF 2.2 的托管 bean 注入点的条件。
它们应该与 JSF 2.3 一起使用(目前仅作为 milestone 提供)使用带有 @FacesConverter 和 @FacesValidator 的附加 managed 属性,如提到的 here。
在 JSF 2.1 中,很少有 JSF 工件是注入目标。在 JSF 2.2 中 在大量额外的人工制品中进行注射成为可能 但实际上注入最重要的是,converters 和验证者,神秘地被冷落了。
在 JSF 2.3 中,这终于得到了如下处理 人工制品已添加到注入目标列表中:
javax.faces.convert.Converterjavax.faces.validator.Validatorjavax.faces.component.behavior.Behavior但是,与此列表中已有的人工制品相比,这些新的 3 不是自动注入目标。 他们只会变得如此 当相应注释上的新属性称为“托管”时
@FacesConverter、@FacesValidator和@Behavior设置为 true。 此外,所有这 3 个注释都已升级为 CDI 通过在其定义中添加@Qualified注释来限定限定符。
@FacesConverter、@FacesValidator和@Behavior没有被修改,意味着它们都是绑定的,如 是新属性“托管”。
但是,managed 属性在 Mojarra 2.3.0-m02 中不可用。
是因为里程碑吗?它是否依赖于特定的 Weld/CDI 版本?我目前正在使用 GlassFish Server 4.1。提到了不同的工件版本here(服务器版本提供的默认 Weld 版本是 2.2.2 final)。
【问题讨论】:
-
刚刚在 Tomcat 8.0.21 + Weld 2.2.10 + Mojarra 2.3.0-m02 上试过,我可以看到当
faces-config.xml仍然被声明为符合 JSF 2.2 时它失败了。在我将它更新到 JSF 2.3 之后,它就可以工作了。您的faces-config.xml声明符合 JSF 2.3 吗? IE。分别为/web-facesconfig_2_3.xsd和version="2.3"(如果 XSD 上的 IDE 错误不可用,请忽略它)。 -
使用
/web-facesconfig_2_3.xsd和version="2.3",浏览器显示500(内部服务器错误)。这是我真正的应用程序中的untraceable。但是,这适用于具有单个 XHTML 文件的项目,其中 IDE 还显示@FacesConverter(managed = false)和@FacesValidator(managed = false)作为默认值,但在实际应用程序中是编译时错误 -cannot find symbol symbol: method managed() location: @interface FacesValidator。 -
我发布了一个答案。至于你的“真正的应用程序”,我怀疑旧版本的 JSF API(不是 impl)的类路径污染,可能是通过
javaee.jar之类的东西?