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

6

@FacesConverter@FacesValidator在JSF 2.2之前不适用于EJB或托管bean注入点。

它们应该使用额外的managed属性与@FacesConverter@FacesValidator一起在JSF 2.3中工作(目前仅作为milestone可用),如此处所述。

在JSF 2.1中,很少有JSF成分被注入。在JSF 2.2中,注入在大量其他成分中变得可能,但是实际上最重要的注入成分转换器和验证器却被神秘地忽略了。在JSF 2.3中,以下成分已被添加到注入目标列表中,这个问题终于得到了解决:
  • javax.faces.convert.Converter
  • javax.faces.validator.Validator
  • javax.faces.component.behavior.Behavior
然而,与已在此列表中的成分相比,这三个新成分不是自动注入目标。 只有当相应注释@FacesConverter@FacesValidator@Behavior上的一个名为"managed"的新属性设置为true时,它们才会成为注入目标。 此外,通过将@Qualified注释添加到其定义中,这三个注释都已升级为CDI限定符。 @FacesConverter@FacesValidator@Behavior的现有属性未被修改,这意味着它们全部是绑定,就像新属性"managed"一样。

然而,在Mojarra 2.3.0-m02中,属性managed不可用。

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


1
刚刚在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?即/web-facesconfig_2_3.xsdversion="2.3"(如果IDE报告XSD不可用,请忽略它)。 - BalusC
使用 /web-facesconfig_2_3.xsdversion="2.3",浏览器显示 500 (内部服务器错误)。这在我的真实应用程序中是无法追踪的。然而,在一个只有单个 XHTML 文件的项目中,IDE 还显示 @FacesConverter(managed = false)@FacesValidator(managed = false) 作为默认值,但在真实应用程序中,这是一个编译时错误 - cannot find symbol symbol: method managed() location: @interface FacesValidator - Tiny
我已经发布了一个答案。关于你的“真实应用程序”,我怀疑是由于旧版本的JSF API(不是实现)导致类路径污染,可能是通过类似javaee.jar这样的东西实现的? - BalusC
1个回答

6

如您所见,在Mojarra 2.3.0-m02的Application#createConverter()实现中,它会检查是否在JSF 2.3模式下运行,根据faces-config.xml version声明,在尝试获取CDI管理的内容之前。

换句话说,为了让@FacesConverter(managed=true)@FacesValidator(managed=true)和这些类中的@Inject正常工作,您需要确保您的Web应用程序的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)在游乐场项目中也没有发出任何错误。因此,实际应用程序的问题是一个独立的故事,需要进一步挖掘。谢谢。 - Tiny
小提示:不要忘记升级web-facesconfig_2_2.xsd部分为web-facesconfig_2_3.xsd。 :-) 同时,您可以通过使用CDI.current(). select(SomeBackingBean.class).get()进行“手动”查找:https://dev59.com/Q2Af5IYBdhLWcg3wUBNc - Roland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接