在使用@Produces批注的方法中,InjectionPoint类型参数变得不满足依赖性错误

时间:2013-12-02 03:49:04

标签: java-ee

以下线(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]

2 个答案:

答案 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起作用了。你有更多的错误日志吗?