JSF 2.2:@NoneScoped bean,注入到另一个范围更广的托管 Bean 中,在 @PostConstruct 中为 NULL
JSF 2.2 : a @NoneScoped bean, injected into another broader scoped Managed Bean is NULL in the @PostConstruct
我相信这个问题可能已经在其他一些线程中得到了解答,但到目前为止我仍然无法让它与我的配置一起工作。
据我了解,注入另一个 bean 的 @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,并尝试访问 resourceBundleProvider 在 @PostConstruct 操作期间
@ManagedBean
@ApplicationScoped
public class MenuBean extends BaseScopedBean {
@PostConstruct
public void init() {
System.out.println(getResourceBundleProvider());
}
}
@PostConstruct 中的 System.out.println(resourceBundleProvider) 打印 NULL
但是,稍后访问 resourceBundleProvider,在从 Facelet EL 表达式调用的方法中,returns 例如,一个有效的创建实例。
问题:这是预期的行为吗?我相信 resourceBundleProvider managed 属性 应该已经在@PostConstruct.
我正在使用 WildFly 8.2.0.Final 和 Apache Myfaces 2.2.7 ,而不是原始的 Mojarra 实现。
有什么想法吗?
提前致谢!!
事实证明,到目前为止,对于 Apache MyFaces 2.2.7(大概是 2.2.8),这似乎是一个错误...之前已在 2.1.x 版本中修复!
对于 Mojarra(至少 2.2.12),行为符合预期。
我相信这个问题可能已经在其他一些线程中得到了解答,但到目前为止我仍然无法让它与我的配置一起工作。
据我了解,注入另一个 bean 的 @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,并尝试访问 resourceBundleProvider 在 @PostConstruct 操作期间
@ManagedBean
@ApplicationScoped
public class MenuBean extends BaseScopedBean {
@PostConstruct
public void init() {
System.out.println(getResourceBundleProvider());
}
}
@PostConstruct 中的 System.out.println(resourceBundleProvider) 打印 NULL
但是,稍后访问 resourceBundleProvider,在从 Facelet EL 表达式调用的方法中,returns 例如,一个有效的创建实例。
问题:这是预期的行为吗?我相信 resourceBundleProvider managed 属性 应该已经在@PostConstruct.
我正在使用 WildFly 8.2.0.Final 和 Apache Myfaces 2.2.7 ,而不是原始的 Mojarra 实现。
有什么想法吗?
提前致谢!!
事实证明,到目前为止,对于 Apache MyFaces 2.2.7(大概是 2.2.8),这似乎是一个错误...之前已在 2.1.x 版本中修复!
对于 Mojarra(至少 2.2.12),行为符合预期。