以下线(CDI,@ Produces和@Injection)出现不满意的依赖关系错误。我不明白原因,请告诉我原因。 (Windows8,NetBeans7.4,GlassFish4.0,JDK1.7)
<beans.LoggingProducer.java>
import java.util.logging.Logger;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.*;
public class LoggingProducer {
@Produces
Logger getInjectionPoint(InjectionPoint ip){ // Warnig: Unsatisfied dependencies !
String name = ip.getMember().getDeclaringClass().getName();
return Logger.getLogger( name ) ;
}
}
<beans.TopPage.java>
import java.io.Serializable;
import java.util.logging.Logger;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
@Named
@SessionScoped
public class TopPage implements Serializable{
@Inject // Error !
Logger log;
}
<Deploy Error messages>
SEVERE: Exception during lifecycle processing
org.glassfish.deployment.common.DeploymentException:
CDI deployment failure:WELD-001408 Unsatisfied dependencies for type [Logger]
with qualifiers [@Default]
at injection point [[BackedAnnotatedField] @Inject beans.TopPage.log]
答案 0 :(得分:1)
好的,这是你的问题:)
首先,java.util.logging.Logger
没有no-arg构造函数。这意味着CDI无法创建其代理对象,这意味着您只能生成@Dependent
范围的java.util.logging.Logger
bean。
第二个是你可能在beans.xml文件中设置了bean-discovery-mode="annotated"
。如果您没有bean.xml文件,那么这是默认的CDI配置。这意味着您必须显式地将范围分配给类,以便CDI能够从类创建bean。在这种情况下,@Producer
方法也需要指定生产bean的范围。例如:
@Produces
@Dependent
Logger produceLogger() {
return Logger.getLogger("My awesome Logger");
}
此外,生产者类必须使用范围进行注释。
作为替代方案,您可以设置bean-discovery-mode="all"
,但我不会推荐它。
答案 1 :(得分:0)
我刚刚发表评论,但似乎我没有足够的声誉这样做。但是,我不相信您所包含的错误指向对InjectionPoint的不满意依赖。相反,它指的是'log'的注入点,说它无法满足'log'作为依赖。说到我不确定是什么问题,注入对JBoss EAP起作用了。你有更多的错误日志吗?