【问题标题】:JSF 2.2 : a @NoneScoped bean, injected into another broader scoped Managed Bean is NULL in the @PostConstructJSF 2.2:一个@NoneScoped bean,注入到另一个范围更广的托管 Bean 在 @PostConstruct 中为 NULL
【发布时间】:2015-09-23 04:38:49
【问题描述】:

我相信这个问题可能已经在其他一些线程中得​​到了回答,但到目前为止我仍然无法使它与我的配置一起工作。

据我了解,注入另一个 @NoneScoped bean 的时间与 Acceptor Bean 的作用域一样长。

到目前为止,确实如此...除了在 Acceptor Bean 的 @PostConstruct 方法期间似乎 Bean 尚不可用。

例如,假设我们有一个基础抽象 bean BaseScopedBean,并带有以下 ManagedProperty 注入:

public abstract class BaseScopedBean implements IBaseBean {

  @ManagedProperty(value = "#{resourceBundleProvider}")
  private ResourceBundleProvider resourceBundleProvider;

  public void setResourceBundleProvider(ResourceBundleProvider resourceBundleProvider) {
    this.resourceBundleProvider = resourceBundleProvider;
  }

  public ResourceBundleProvider getResourceBundleProvider() {
    return this.resourceBundleProvider;
  }
}

ResourceBundleProvider 看起来就像这样:

@ManagedBean ( name = "resourceBundleProvider")
@NoneScoped
public class ResourceBundleProvider {

  public ResourceBundle getBundle(String bundleName) {
      FacesContext context = FacesContext.getCurrentInstance();
      return context.getApplication().getResourceBundle(context, bundleName);
  }

  public String getValue(String bundleName, String key) {

      try {
          return getBundle(bundleName).getString(key);
      } catch (MissingResourceException e) {
          return '!' + key + '!';
      }
  }

  public String getValue(String bundleName, String key, Object... params) {

      try {
          return MessageFormat.format(getBundle(bundleName).getString(key), params);
      } catch (MissingResourceException e) {
          return '!' + key + '!';
      }
  }
}

然后,我们定义一个扩展 BaseScopedBean@ApplicationScoped bean,并在 @PostConstruct 期间尝试访问 resourceBundleProvider 操作

@ManagedBean
@ApplicationScoped
public class MenuBean extends BaseScopedBean {

  @PostConstruct
  public void init() {
      System.out.println(getResourceBundleProvider());
  }
}

@PostConstruct 中的 System.out.println(resourceBundleProvider) 打印 NULL

但是,例如,稍后在从 Facelet EL 表达式调用的方法中访问 resourceBundleProvider,会返回一个有效的创建实例。

问题:这是预期的行为吗?我相信 resourceBundleProvider 托管属性应该已经在 @PostConstruct 中可用。 p>

我将 WildFly 8.2.0.FinalApache Myfaces 2.2.7 一起使用,而不是最初的 Mojarra 实现。

有什么想法吗?

提前非常感谢!!

【问题讨论】:

    标签: jsf jakarta-ee jsf-2 dependency-injection


    【解决方案1】:

    事实证明,到目前为止,对于 Apache MyFaces 2.2.7(可能是 2.2.8),这似乎是一个错误...之前已在 2.1.x 版本中修复!

    使用 Mojarra(至少 2.2.12),行为是预期的。

    【讨论】:

    猜你喜欢
    • 2012-03-24
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多