6

@FacesConverter并且@FacesValidator不符合 EJB 或最高 JSF 2.2 的托管 bean 注入点的条件。

它们应该与 JSF 2.3 一起使用(目前仅作为里程碑提供),使用带有和的附加managed属性,如此所述。@FacesConverter@FacesValidator

在 JSF 2.1 中,很少有 JSF 工件是注入目标。在 JSF 2.2 中,大量额外的人工制品使注入成为可能,但注入实际上最重要的那些,转换器和验证器,却神秘地被冷落了

在 JSF 2.3 中,这终于得到了解决,因为以下人工制品已添加到注入目标列表中:

  • javax.faces.convert.Converter
  • javax.faces.validator.Validator
  • javax.faces.component.behavior.Behavior

然而,与此列表中已有的人工制品相比,这 3 个新产品并非自动注入目标。只有在相应的注解上有一个名为“managed”的新属性 @FacesConverter并且@FacesValidator设置@Behavior为 true 时,它​​们才会如此。@Qualified此外,通过将注释添加到它们的定义中, 所有这 3 个注释都已升级为 CDI 限定符。

的现有属性@FacesConverter和没有被修改,这意味着它们都是@FacesValidator绑定 ,新属性“托管”也是如此。@Behavior

但是,该属性managed在 Mojarra 2.3.0-m02 中不可用。

是因为里程碑吗?它是否依赖于特定的 Weld/CDI 版本?我目前正在使用 GlassFish Server 4.1。这里提到了不同的工件版本(服务器版本提供的默认 Weld 版本是 2.2.2 final)。

4

1 回答 1

6

正如您在 Mojarra 2.3.0-m02 的Application#createConverter()implementation中看到的那样,它会在尝试获取 CDI 管理的模式之前根据声明检查它是否在 JSF 2.3 模式下运行。faces-config.xml version

换句话说,为了获得@FacesConverter(managed=true)@FacesValidator(managed=true)并因此@Inject在这些类中工作,您需要确保您的 webappfaces-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 并忽略 unsupported 上的任何 IDE 警告/错误version


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

于 2015-05-04T11:56:29.300 回答