Java 在JBoss 7.3上注入本地EJB-@EJB vs@Inject

Java 在JBoss 7.3上注入本地EJB-@EJB vs@Inject,java,jakarta-ee,jboss,Java,Jakarta Ee,Jboss,我有一个包含战争的EAR文件 EAR包含一个EJB jar。EJB公开了一个本地和远程接口 @Stateless(name = "FooServiceEJB") @Local(IFooServiceLocal.class) @Remote(IFooService.class) public class FooServiceBean implements IFooService, IFooServiceLocal { ... } WAR文件定义了一个JAXRS注释类 @Path("/

我有一个包含战争的EAR文件

  • EAR包含一个EJB jar。EJB公开了一个本地和远程接口

    @Stateless(name = "FooServiceEJB")
    @Local(IFooServiceLocal.class)
    @Remote(IFooService.class)
    public class FooServiceBean implements IFooService, IFooServiceLocal {
        ...
    }
    
  • WAR文件定义了一个JAXRS注释类

    @Path("/foo")
    @LocalBean
    @Stateless
    public class FooResource {
       ...
    }
    
我希望将EJB的本地“视图”注入到JAXRS资源类中。显然,我有两个选择,我认为这两个选择是相等的(大部分):

  • 使用@EJB
  • 使用@Inject(对许多人来说,这似乎是首选选项-请参阅)
  • 我正在运行JBossEAP6.2.0.GA(作为7.3.0.Final-redhat-14)

    我看到的行为差异如下(在JBoss上-没有尝试过任何其他应用服务器):

    如果我使用@EJB注入本地EJB,那么调用语义通过引用(如预期的那样)。例如:

    @EJB
    private FooServiceLocal fooService;
    
    @Inject
    private IFooServiceLocal fooService;
    
    但是,如果我使用@Inject来注入本地ejb,则调用语义是按值(即发生序列化)。例如:

    @EJB
    private FooServiceLocal fooService;
    
    @Inject
    private IFooServiceLocal fooService;
    
    下面是线程堆栈的快照,我认为该类正在执行序列化。当我使用@EJB注释时,线程堆栈是完全不同的

    你知道我为什么会看到这种行为上的差异吗