JSF 2.3中@FacesConverter和@FacesValidator中的EJB和托管bean注入

JSF 2.3中@FacesConverter和@FacesValidator中的EJB和托管bean注入,jsf,converter,jsf-2.3,Jsf,Converter,Jsf 2.3,@facescoverter和@FacesValidator不符合JSF 2.2之前的EJB或托管bean注入点的条件 他们应该使用附加的managed属性和前面提到的@facescoverter和@FacesValidator与JSF2.3(目前仅作为一个可用)一起工作 在JSF2.1中,很少有JSF工件是注入目标。在JSF2.2中 大量额外的人工制品使注射成为可能 但实际上注入最重要的地方,转换器 而验证器则神秘地被冷落了 在JSF2.3中,这一点现在终于得到了解决,如下所示 人工制品已添加

@facescoverter
@FacesValidator
不符合JSF 2.2之前的EJB或托管bean注入点的条件

他们应该使用附加的
managed
属性和前面提到的
@facescoverter
@FacesValidator
与JSF2.3(目前仅作为一个可用)一起工作

在JSF2.1中,很少有JSF工件是注入目标。在JSF2.2中 大量额外的人工制品使注射成为可能 但实际上注入最重要的地方,转换器 而验证器则神秘地被冷落了

在JSF2.3中,这一点现在终于得到了解决,如下所示 人工制品已添加到注射目标列表中:

  • javax.faces.convert.Converter
  • javax.faces.validator.validator
  • javax.faces.component.behavior.behavior
然而,与此列表中已有的文物相比,这些新的3 不是自动注入目标他们只会变得如此 当在相应的注释上出现一个名为“managed”的新属性时
@facescoverter
@FacesValidator
@Behavior
设置为true。
此外,所有这3个注释都已升级为CDI 通过将
@Qualified
注释添加到限定符的定义中来限定符

@facescoverter
@FacesValidator
@Behavior
未被修改,这意味着它们都具有约束力,如下所示 是新属性“managed”

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


是因为一个里程碑吗?是否取决于特定的焊接/CDI版本?我目前正在使用GlassFish服务器4.1。提到了不同的工件版本(服务器版本提供的默认焊接版本是2.2.2 final)。

正如您在Mojarra 2.3.0-m02中所看到的,在尝试获取CDI管理的工件之前,它将根据
faces config.xml
版本
声明

换句话说,为了让
@facescoverter(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.2 XSD,忽略不受支持的
版本
上的任何IDE警告/错误



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

刚刚在Tomcat 8.0.21+Weld 2.2.10+Mojarra 2.3.0-m02上进行了尝试,我可以看到当
faces config.xml
仍然声明符合JSF 2.2时,它失败了。在我将它更新到JSF2.3之后,它就可以工作了。您的
faces config.xml
是否声明符合JSF 2.3?即分别为
/web-facesconfig_2_3.xsd
version=“2.3”
(如果xsd上的IDE错误不可用,请忽略它)。使用
/web-facesconfig_2_3.xsd
version=“2.3”
,浏览器显示500(内部服务器错误)。这是我真正的应用程序。然而,这在一个使用单个XHTML文件的项目中起作用,其中IDE还默认显示
@FacesConverter(managed=false)
@FacesValidator(managed=false)
,但在实际应用中,编译时错误-
找不到符号:method managed()位置:@interface FacesValidator
。我发布了答案。至于你的“真正的应用程序”,我怀疑旧版本的JSF API(不是impl)会污染类路径,可能是通过
javaee.jar
?IDE(NetBeans 8.0.2)在项目中也不会出现任何错误。因此,实际应用程序的问题是一个故事,需要进一步挖掘。谢谢。小提示:不要忘记要升级到
web-facesconfig_2_2.xsd
web-facesconfig_2_3.xsd
。:-)同时,您可以使用
CDI.current().select(SomeBackingBean.class).get()进行“手动”查找。