Jsf CDI@products具有多个属性文件
感谢这篇文章,我现在使用CDI在我的@Named bean中提供msg,如下所示:Jsf CDI@products具有多个属性文件,jsf,cdi,inject,resourcebundle,Jsf,Cdi,Inject,Resourcebundle,感谢这篇文章,我现在使用CDI在我的@Named bean中提供msg,如下所示: @RequestScoped public class BundleProducer { @Produces public PropertyResourceBundle getBundle() { FacesContext context = FacesContext.getCurrentInstance(); return context.getApplication().evaluateEx
@RequestScoped
public class BundleProducer {
@Produces
public PropertyResourceBundle getBundle() {
FacesContext context = FacesContext.getCurrentInstance();
return context.getApplication().evaluateExpressionGet(context, "#{msg}", PropertyResourceBundle.class);
}
}
使用类似注入的:
@Inject
private PropertyResourceBundle bundle;
问题:如果我有更多属性文件,我该怎么办:
ui.properties
,admin.properties
…?我只需使用分类器注释来选择要注入的包。摘自我的一个小项目:
注释:
@Qualifier
@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface Bundle {
@Nonbinding
public String value() default "";
}
生产者方法(根据您的上下文需要进行调整):
注射:
@Inject @Bundle("ui")
private ResourceBundle uiResources;
我个人会尽量减少MessageBundle的数量,并使用“复合键”(ui.xxx,admin.yyy)不知道这是否是最佳实践,但这对我来说很有用。我也在寻找关于这一点的最佳实践。首先,我建议您制作
ResourceBundle
,而不是特定的属性ResourceBundle
。然后您可以使用CDI限定符来区分各种捆绑包。酷,简单但灵活。@mtj我有以下异常:生命周期处理期间的异常org.glassfish.deployment.common.DeploymentException:CDI部署失败:WELD-001408:注入点处带有限定符@Bundle的ResourceBundle类型的未满足依赖项[BackedAnnotatedField]@Inject@Bundle private com.mypckage.MyBean.uiResources
任何帮助please@Hicham您可以按现在的状态发布代码吗?Bundle接口package com.locale代码>导入java.lang.annotation.ElementType代码>导入java.lang.annotation.Retention代码>导入java.lang.annotation.RetentionPolicy代码>导入java.lang.annotation.Target代码>导入javax.enterprise.util.Nonbinding代码>导入javax.inject.Qualifier
@Qualifier
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
公共接口包{
`Nonbinding``公共字符串值()默认值”“;`code>}
BundleProducerpackage com.locale;导入java.util.ResourceBundle;导入javax.enterprise.inject.products;导入javax.enterprise.inject.spi.InjectionPoint;公共类BundleProducer{atBundle公共资源Bundle loadBundle(注入点ip){String bundleName=ip.getAnnotated().getAnnotation(Bundle.class).value();ResourceBundle res=ResourceBundle.getBundle(bundleName);返回res;}
使用ResourceBundle@Inject@Bundle(“用户”)私有BundleProducer uiResources代码>
@Inject @Bundle("ui")
private ResourceBundle uiResources;