【问题标题】:EJB and managed bean injections in @FacesConverter and @FacesValidator in JSF 2.3JSF 2.3 中 @FacesConverter 和 @FacesValidator 中的 EJB 和托管 bean 注入
【发布时间】: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.Converter
  • javax.faces.validator.Validator
  • javax.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.xsdversion="2.3"(如果 XSD 上的 IDE 错误不可用,请忽略它)。
  • 使用/web-facesconfig_2_3.xsdversion="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 之类的东西?

标签: jsf converter jsf-2.3


【解决方案1】:

正如您在 Mojarra 2.3.0-m02 的 Application#createConverter() implementation 中看到的那样,在尝试获取 CDI 管理的声明之前,它 checks if it's running in JSF 2.3 mode 按照 faces-config.xml version 声明。

换句话说,为了使这些类中的@FacesConverter(managed=true)@FacesValidator(managed=true)@Inject 正常工作,您需要确保您的webapp 的faces-config.xml 被声明为符合JSF 2.3,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd"
    version="2.3">

    <!-- Config here. -->

</faces-config>

需要注意的是,IDE 可能会在JSF 2.3 XSD 文件尚未公开(尚未)上出错,您可以放心地忽略该部分,JSF 在运行时不会对其进行验证。您也可以坚持使用 2.2 XSD 并忽略不受支持的 version 上的任何 IDE 警告/错误。


jdevelopment.nl 博客作者已收到通知,他将确保在下一次更新中,上述内容也会在博客中得到澄清。

【讨论】:

  • IDE (NetBeans 8.0.2) 在 Playground 项目中也不会出现任何错误。因此,实际应用程序的问题是另一个故事,需要进一步深入研究。谢谢。
  • 小旁注:不要忘记将web-facesconfig_2_2.xsd 部分也升级为web-facesconfig_2_3.xsd。 :-) 同时,您可以使用 CDI.current().select(SomeBackingBean.class).get() 进行“手动”查找:stackoverflow.com/questions/24798529/…
猜你喜欢
  • 2012-01-27
  • 1970-01-01
  • 2014-03-19
  • 2013-07-28
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多