2014-09-04 42 views
1

由于EJB 3.1,bean不需要有一个本地接口,而且我通常不使用一个:EJB 3.1 - 为什么无状态bean必须通过它的接口注入(如果有的话)?

@Stateless 
public class MyService(){ 
    public void buisnesssMethodA(){ 
     ... 
    } 

    public void buisnesssMethodB(){ 
     ... 
    } 
} 

,在我的CDI豆我只是做

@Inject 
private MyService myService; 

这是简单而简单,而且工作得很好。

现在我最近发现了一些东西。

想象一下,我需要一个接口,它代表我业务方法的子集

public interface MyInterface{ 
    void businessMethodA(); 
} 

现在,如果我让我的无状态的bean实现了这个接口,JBoss的部署失败,并引发错误

WELD-001408 Unsatisfied dependencies for type [MyService] with qualifiers [@Default] at injection point [[field] @Inject 

所以我相信我遵守以下规则:

如果一个无状态bean没有接口,它可以使用这个类来注入。如果它实现了一个接口,它必须使用接口注入。

这里是我的问题:

  1. 这是规则是否正确?
  2. 如果是这样,它是由EBJ规范定义的?
  3. 这个限制的原因是什么?
+1

我不能转向你的排队,但如果你喜欢一个解决方法,你可以尝试'@ LocalBean'注释。这帮助我处于类似的情况。 – Tom 2014-09-04 10:56:07

+0

@Tom正是我需要的感谢! – phoenix7360 2014-09-04 12:05:14

回答

0

从我有限的Java EE和CDI的知识:

  • CDI不无状态会话bean本身管理EJB 3.1(它不会有所有的生命周期和拦截器),但它可以@Inject暴露了这些bean的本地视图
  • 如果会话bean没有实现任何接口,会话bean可能会暴露当地业务接口视图(如果它具有接口或无接口视图(由bean公共方法组成)
  • )默认情况下它暴露无界面视图 - 因此你可以无界面注入MyService。这相当于使用@LocalBean注释bean。请注意,使用@LocalBean,即使Bean类实现接口,也可以公开无顺序视图 - 因此,如果会话Bean实现接口并且未标记为@LocalBean,则Tom的评论在Java EE 7中工作
  • ,此接口为默认情况下,公开为bean的本地视图 - 因此你不能注入的MyService它实现MyInterface的后,因为没有接口视图(为MyService)不再暴露,并且接口视图MyInterface的暴露为本地视图,而不是

希望这回答你的问题3,并部分证实,部分无效从你的规则questoin 1.我不能打扰现在回答问题2,但...

相关问题