【发布时间】:2018-08-16 13:00:26
【问题描述】:
基于建议的解决方案here,我正在尝试使用 CDI @Produces 以便能够使用 @Inject 访问多个属性文件:
捆绑接口
package com.locale;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.enterprise.util.Nonbinding;
import javax.inject.Qualifier;
@Qualifier
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Bundle {
@Nonbinding
public String value() default "";
}
BundleProducer 类
package com.locale;
import java.io.Serializable;
import java.util.ResourceBundle;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
public class BundleProducer implements Serializable{
@Produces
@Bundle
public ResourceBundle loadBundle(InjectionPoint ip) {
String bundleName = ip.getAnnotated().getAnnotation(Bundle.class).value();
ResourceBundle res = ResourceBundle.getBundle(bundleName);
return res;
}
}
我注入包的类:
@Named
@SessionScoped
public class PasswordBean implements Serializable {
@Inject @Bundle("com.locale.admin.user")
private ResourceBundle uiResources;
public String chgPassword() {
if (currentPwd isNotOk) {
FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, uiResources.getString("cpwdIncorrect"), "");
ctx.addMessage(null, fm);
return null;
}
}
}
例外情况:
Exception while loading the app : CDI deployment failure:WELD-001408: Unsatisfied dependencies for type ResourceBundle with qualifiers @Bundle
at injection point [BackedAnnotatedField] @Inject @Bundle private com.security.PasswordBean.uiResources
at com.security.PasswordBean.uiResources(PasswordBean.java:0)
org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type ResourceBundle with qualifiers @Bundle
at injection point [BackedAnnotatedField] @Inject @Bundle private com.security.PasswordBean.uiResources
请帮忙。
【问题讨论】:
-
从你提供的小代码看来,生产者没有找到(也就是声明它的类不被识别为bean),你有
beans.xml吗?尝试使用 bean defining annotation 注释您的BundleProducer类。 -
感谢@Siliarus,我已将 SessionScoped 注释添加到 BundleProducer。我现在有这个错误:
Producers cannot produce unserializable instances for injection into an injection point that requires a passivation capable dependency Producer: Producer Method [ResourceBundle] with qualifiers [@Bundle @Any] declared as [[BackedAnnotatedMethod] @Produces @Bundle public com.locale.BundleProducer.loadBundle(InjectionPoint)] at com.locale.BundleProducer.loadBundle(BundleProducer.java:15) Injection Point: [BackedAnnotatedField] @Inject @Bundle private com.security.PasswordBean.uiResources -
@SessionScoped似乎不合适(但不是您现在遇到的错误的根源) - 我会选择@ApplicationScoped或@Dependent代替。至于错误,它告诉您生产者创建了一个不可序列化的实例(ResourceBundle),而您正试图将其注入需要可序列化字段的PasswordBean- 我想PasswordBean是@SessionScoped?在这种情况下,您必须确保生产者方法创建可序列化的 bean。 -
有了
@ApplicationScoped,我得到:An injection point has type InjectionPoint and qualifier @Default but bean declares not @Dependent scope.,紧跟在方法签名public ResourceBundle loadBundle(InjectionPoint ip)之后,有了@Dependent,我在运行时得到:Producers cannot produce unserializable instances for injection into an injection point that requires a passivation capable dependency Producer: Producer Method [ResourceBundle] with qualifiers [@Bundle @Any] declared as [[BackedAnnotatedMethod] @Produces @Bundle public com.locale.BundleProducer.loadBundle(InjectionPoint)] -
通过 SO 的一些骚动也给了我 - stackoverflow.com/questions/3000170 和 stackoverflow.com/questions/35755944 人们遇到了
ResourceBundle序列化问题。你也可以在那里激发灵感。
标签: jsf cdi inject resourcebundle