gpt4 book ai didi

jsf - @FacesComponent 中的 @Inject 值 null

转载 作者:行者123 更新时间:2023-12-01 07:19:23 29 4
gpt4 key购买 nike

我的印象是 CDI 不适用于具有 @javax.faces.component.FacesComponent 的类。 .这是真的?

这是我的例子,这不起作用。 MyInjectableClass用于代码中注入(inject)不是问题的其他点,因此它必须是关于 @FacesComponent我认为注释。

我要注入(inject)的类:

@Named
@Stateful
public class MyInjectableClass implements Serializable {

private static final long serialVersionUID = 4556482219775071397L;
}

使用该类的组件;
@FacesComponent(value = "mycomponents.mytag")
public class MyComponent extends UIComponentBase implements Serializable {

private static final long serialVersionUID = -5656806814384095309L;

@Inject
protected MyInjectableClass injectedInstance;


@Override
public void encodeBegin(FacesContext context) throws IOException {
/* injectedInstance is null here */
}
}

最佳答案

不幸的是,即使对于 JSF 2.2 @FacesComponent , @FacesValidator@FacesConverter不是有效的注入(inject)目标(阅读 What's new in JSF 2.2? Arjan Tijms 的更多详细信息)。正如 Arjan 指出的那样:

It’s likely that those will be taken into consideration for JSF 2.3 though.



你现在能做什么?好吧,您基本上有两种选择:
  • 拉手CDI injection via lookup ,或切换到 EJB 并执行 simpler EJB lookup ;
  • 使用 @Named 注释游览类而不是 @FacesComponent , @Inject您所做的组件和register your component in faces-config.xml .由于 UI 组件实例是通过 JSF Application#createComponent() 创建的,而不是通过 CDI 创建的,因此您还需要自定义应用程序实现(就像 OmniFaces 为那些转换器/验证器提供的那样)。

  • 而且,顺便说一句,到目前为止,您有两个问题:(1) @Named @Stateful 的含义是什么?当前者来自 CDI 世界而后者来自 EJB 世界并且 (2) 你确定你打算将状态保留在基本上在每个请求上重新创建的 faces 组件中?

    关于jsf - @FacesComponent 中的 @Inject 值 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19223294/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com