【问题标题】:Unsatisfied dependencies for type ResourceBundle with qualifiers @Bundle带有限定符 @Bundle 的类型 ResourceBundle 的依赖关系不满足
【发布时间】: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/3000170stackoverflow.com/questions/35755944 人们遇到了 ResourceBundle 序列化问题。你也可以在那里激发灵感。

标签: jsf cdi inject resourcebundle


【解决方案1】:

This post 帮助我更正并运行代码,没有任何进一步的异常

@Inject
@com.locale.Bundle("com.locale.admin.user")
private transient ResourceBundle uiResources;

transient 到 ResourceBundle。 非常感谢@Siliarus

【讨论】:

    猜你喜欢
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    相关资源
    最近更新 更多