升级到 JSF 2.3 后,@Inject 在 @FacesConverter 中不起作用
Posted
技术标签:
【中文标题】升级到 JSF 2.3 后,@Inject 在 @FacesConverter 中不起作用【英文标题】:@Inject not working in @FacesConverter after upgrade to JSF 2.3 【发布时间】:2021-10-29 00:17:16 【问题描述】:我将 Primefaces 6 应用程序迁移到 JBoss EAP 7.4 并升级到 Primefaces 10 和 JSF2.2 到 JSF2.3。在这次迁移之后,我们在 FacesConverter 中的 @Inject 没有被初始化,因此返回 null。这个问题可能是重复的 (https://***.com/a/47447140/1918516),建议的答案没有解决我的问题。
在我当前的项目结构之下。
faces-config.xml
<?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">
...
</faces-config>
MyConverter.java
@FacesConverter(value = "MyConverter", managed = true)
@FacesConfig(version = FacesConfig.Version.JSF_2_3)
public class MyConverter implements Converter
...
@Inject
private MyBean myBean;
MyBean.java
@Stateless
@Named
public class MyBean
...
Jsf23Activator.java
@ApplicationScoped
@FacesConfig(version = FacesConfig.Version.JSF_2_3)
public class Jsf23Activator
web.xml
<web-app 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-app_4_0.xsd"
version="4.0">
...
<context-param>
<param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
<param-value>0</param-value>
</context-param>
<context-param>
<param-name>javax.faces.validator.ENABLE_VALIDATE_WHOLE_BEAN</param-name>
<param-value>true</param-value>
</context-param>
</web-app>
我还没有创建 beans.xml,因为据我所知,较新的版本不需要它。同样在创建一个时,我遇到了常见错误:
引起:org.jboss.weld.exceptions.DeploymentException:WELD-001408: MyDao 类型的依赖项不满足 限定符@Default
我通过注入 CDI.current().select(MyBean.class).get();
使其适用于转换器,但对我来说这只是一种解决方法
另一种方法是从 MyConverter 中创建一个 @Named 并在我的 jsf 中使用以下内容,但这对于 JSF 2.2 而不是 2.3 来说是理想的:
【问题讨论】:
我目前正在使用以下依赖项 jboss-jsf-api_2.3_spec 。这是由 JBoss 7.4 提供的所以我的问题是 JSF 2.3,但我似乎没有发现我可能做错了什么。 嗯,我正在使用 Jboss EAP 7.4 并且我的 @Inject 在我的转换器中工作正常? ```java 【参考方案1】:实现的缺失部分是 beans.xml 文件,我故意不使用它,因为从 1.1 版开始它不是强制性的,正如我的问题中提到的那样。
看起来为了在 FacesConverter 中注入,还需要创建以下 beans.xml 文件。
<?xml version="1.0" encoding="UTF-8"?>
<beans 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/beans_2_0.xsd"
bean-discovery-mode="all"
version="2.0">
</beans>
【讨论】:
【参考方案2】:我使用 Jboss 7.4 EAP,我的 @Inject 在我的转换器中运行良好。这是我的示例转换器。然后我的 WEB-INF/ 文件夹中确实有一个 beans.xml。
@FacesConverter(forClass = AnnulmentReason.class)
public class AnnulmentReasonConverter extends AbstractEntityConverter<AnnulmentReason, Long>
/** ApplicationScoped cache */
@Inject
EntityCache<AnnulmentReason, Long> cache;
@Override
protected AnnulmentReason getObjectById(final Long id)
final Map<Long, AnnulmentReason> map = cache.getMap();
final AnnulmentReason ar = map.get(id);
return ar;
@Override
protected Long getObjectId(final AnnulmentReason entity)
return entity.getId();
【讨论】:
谢谢,这看起来实际上与我实现它的方式相同。我缺少 beans.xml ,我知道,但这不应该是强制性的,从来没有版本。我试图避免使用 beans.xml,因为这会导致我的 Beans 出现其他问题。 我会说尝试 beans.xml 看看这是否是您的问题的原因。这可能是 Jboss EAP 中的一个错误。以上是关于升级到 JSF 2.3 后,@Inject 在 @FacesConverter 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
JSF-2.3 找不到我的 @Named CDI-1.2 托管 bean
如何使用指定版本2.3的JSF Facet创建Eclipse动态Web项目?
升级到 jsf2 后的 ViewExpiredException
<t:inputFileUpload> 将 JSF 1.2 迁移到 JSF 2.2 后不再工作