2014-09-22 37 views
4

我有以下接口如何注入接口實現?

public interface IMyMapper<T> {} 

public class MyMapper implements IMyMapper<MyClazz> {} 

現在我想給類MyMapper注入到一個無狀態的bean的實現:

@Stateless 
public class MyService { 

    @Inject 
    MyMapper mapper; //<-- does not work 

    @Inject 
    IMyMapper<MyClazz> mapper; //<-- also does not work 
} 

我的問題是,注射不起作用。我收到一個例外:

org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type MyMapper with qualifiers @Default 
at injection point [BackedAnnotatedField] @Inject mypackage.MyService.mapper 
at mypackage.MyService.mapper(MyService.java:0) 

at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:370) 
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:291) 
at org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:134) 
at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:165) 
at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:529) 
at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:515) 
at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:490) 
at org.jboss.weld.bootstrap.WeldStartup.validateBeans(WeldStartup.java:419) 
at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:90) 
at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:225) 
at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:131) 
at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:328) 
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:496) 
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:219) 
at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:491) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:539) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:535) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.Subject.doAs(Subject.java:360) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:534) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:565) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:557) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.Subject.doAs(Subject.java:360) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:556) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1464) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1300(CommandRunnerImpl.java:109) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1846) 
at org.glassfish.deployment.autodeploy.AutoOperation.run(AutoOperation.java:164) 
at org.glassfish.deployment.autodeploy.AutoDeployer.deploy(AutoDeployer.java:597) 
at org.glassfish.deployment.autodeploy.AutoDeployer.deployAll(AutoDeployer.java:484) 
at org.glassfish.deployment.autodeploy.AutoDeployer.run(AutoDeployer.java:412) 
at org.glassfish.deployment.autodeploy.AutoDeployer.run(AutoDeployer.java:403) 
at org.glassfish.deployment.autodeploy.AutoDeployService$1.run(AutoDeployService.java:233) 
at java.util.TimerThread.mainLoop(Timer.java:555) 
at java.util.TimerThread.run(Timer.java:505) 
]] 

我該如何解決這個問題?

+0

絕對不是一個騙局,但它可能已經回答過。 – 2014-09-22 23:12:20

+0

從我的觀點來看,沒有重複。當然,在開始問題之前,我已經通過SO進行了搜索,但找不到令人滿意的答案。 – flash 2014-09-23 06:16:03

+0

我認爲@KumarAbhinav是正確的(可能重複)。 CDI1.1默認使用註釋來發現bean。由於指定的bean不包含任何作用域註釋,我們也不會告知beans.xml文件是否存在。 – maress 2014-09-23 08:32:47

回答

5

您可能在annotated豆發現模式(the default mode in CDI 1.1+),這就是爲什麼你的類MyMapper不被視爲一個bean類。在這種模式下,被發現的bean類應該有bean defining annotation@Stateless是一個定義註釋的bean,所以你的EJB也是一個CDI bean,但是它的注入點不能被滿足,因爲MyMapper沒有被發現一個bean類。

爲了讓你的代碼工作儘量把@Dependent你的類

@Dependent  
public class MyMapper implements IMyMapper<MyClazz> {} 

或者你可以改變你的項目的發現模式stated in the specification