WELD-001408注入实现接口的EJB时的不满意依赖关系

问题描述:

这是情况。WELD-001408注入实现接口的EJB时的不满意依赖关系

我已经得到了以下接口:

public interface Parent { } 
public interface ChildOne extends Parent { } 
public interface ChildTwo extends Parent { } 

和2的EJB:

@Stateless 
public class FirstBean implements ChildOne { } 

@Stateless 
public class SecondBean implements ChildTwo { } 

而且也是这个CDI豆:

@Named 
@SessionScoped 
public class TestController implements Serializable { 

    @Inject 
    private FirstBean firstBean; 

    @Inject 
    private SecondBean secondBean; 
} 

在尝试部署此在Glassfish 3.1上我得到以下异常:

Exception while loading the app : WELD-001408 Unsatisfied dependencies for type [FirstBean] 
with qualifiers [@Default] at injection point [[field] @Inject private com.test.controllers.TestController.firstBean] 
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [FirstBean] 
with qualifiers [@Default] at injection point [[field] @Inject private com.test.controllers.TestController.firstBean] 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:305) 

当两个EJB实现Parent接口时,异常都是相同的。
另外,我尝试添加修饰符,但这并没有改变任何东西。

我只是你的构建发挥各地,读一位焊缝docu,发现了以下内容。

您正在使用实现接口的EJB,因此无界面视图不再可能(显然),但您试图直接访问实现。只要你将它声明为一个EJB,你就必须记住这些约定。所以,如果你定义了一个接口,你必须使用它来访问EJB。它更改为以下,应该制定出:

@Inject 
private ChildOne firstBean; 

访问即使一个接口定义的实现只是可能的纯CDI托管Bean(不带@无国籍/班@有状态的注释)。所以摆脱你的注释,它会解决。

仅供参考,如果您使用的是Glassfish。如果您坚持使用EJB并尝试访问父接口方法,则会遇到this错误/异常。

+0

谢谢!真的很好的解释!我已经碰到了这个异常:“无法将ejbRef转换为ejb ...”,我只是不知道这是一个已知的问题。 – jFrenetic 2012-01-28 10:22:59

+0

我再次检查过它。按照您的建议,我尝试通过接口引用来注入这些EJB。而且我在部署过程中仍然会收到这个'Unsatisfied dependencies ...'异常。我甚至用@Local注解了接口。它仍然不起作用。 – jFrenetic 2012-01-28 12:21:39

+0

昨天我试了一下,它为我工作,而且它有一定的意义。无论如何,当我回家时我会再试一次。 – 2012-01-28 12:43:05

您是否试过使用@EJB注释而不是CDI @inject注释?

E.g.

@Named 
@SessionScoped 
public class TestController implements Serializable { 

    @EJB 
    private FirstBean firstBean; 

    @EJB 
    private SecondBean secondBean; 
} 
+0

不,我没有。感谢这个想法,但我真的很想理解我在这里做错了什么。 – jFrenetic 2012-01-27 19:37:18

+0

您的META-INF中是否有beans.xml? – 2012-01-27 22:26:25

+0

我确定。如果我没有它,那么WELD将无法检测到我的CDI bean,并且在部署期间不会执行验证。 – jFrenetic 2012-01-27 22:28:20

晚总比不来好:

@LocalBean对我的作品与JBoss AS 7.1.1注解SLSB的方法,另外。我不喜欢创造没有附加价值的界面。

使用你的例子:

@Stateless 
@LocalBean 
public class FirstBean implements ChildOne { } 

@Stateless 
@LocalBean 
public class SecondBean implements ChildTwo { } 
+0

@atamanroman ,你知道这种方法是否便携?由于'@ LocalBean'的定义是“指定**会话** bean公开一个无界面视图”,并且因为它不是“会话”bean,所以它可以在任何地方工作,这是正确的做法吗? – 2012-11-22 15:59:45

+1

@AnthonyO。无状态会话bean和有状态会话bean都是会话bean。所以是的,这与标准要求完全相同。 – atamanroman 2012-11-22 16:21:06

+0

它也适用于JBoss 6.1.0 – Ste 2014-01-10 15:21:29