JSF 2.2:@NoneScoped bean,在@PostConstruct中注入另一个更广泛的作用域Managed Bean是NULL

时间:2015-07-06 06:26:48

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

我相信这个问题可能已在其他一些主题中得到解答,但到目前为止,我仍然无法使其适用于我的配置。

据我了解,注入另一个的 @NoneScoped bean将与Acceptor Bean的范围一样长。

到目前为止,确实如此......除了在接受者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表达式调用的方法中访问 resourceBundleProvide r会返回有效的已创建实例,例如。

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

我使用 WildFly 8.2.0.Final Apache Myfaces 2.2.7 ,而不是原始的Mojarra实现。

有什么想法吗?

提前多多感谢!!

1 个答案:

答案 0 :(得分:1)

事实证明,到目前为止,使用Apache MyFaces 2.2.7(大概是2.2.8)这似乎是一个错误......以前在2.1.x版本中修复过!!

对于Mojarra(至少2.2.12),行为是预期的行为。

相关问题