通过远程接口将EJB注入servlet

时间:2013-04-12 14:52:49

标签: java ejb cdi

我正在审查一些Jave EE 6代码,并怀疑它的正确性:

@WebServlet
public class FooServlet {
  @EJB
  private transient BarRemoteInterface bar;
}

@Remote
public interface BarRemoteInterface {
}

@Stateless
public class BarBean implements BarRemoteInterface {
}
  • 我想知道transient关键字是否属实,因为注入的代理不会被序列化。 (或将会,但没有效果?)

  • 我认为如果我们不使用pass-by-copy参数传递注入远程接口会更有效。相反,我们宁愿用@EJB BarBean注入EJB,以便使用它自动生成(?)本地接口。我是对的吗?

  • 在这种情况下,即使@EJB可以替换为@Inject,因为这更为一般

如果他们是正确的,你能评论我的想法吗?

1 个答案:

答案 0 :(得分:3)

  

我想知道transient关键字是否属实   因为注入的代理不会被序列化,所以有意义。 (或者会   是,但没有效果?)

不需要瞬态。 EJB规范说远程代理必须是可序列化的。如果需要,可以让您的界面扩展Serializable。

  

我认为如果我们不注射遥控器会更有效   接口,因为它使用pass-by-copy参数传递。相反,我们   而是使用@EJB BarBean注入EJB,以便它自动化   生成(?)本地接口将被使用。我是对的吗?

是的,@Remote基本上是'传递副本'(不是真的,但这已足够接近了)。一些应用容器无论如何都可以优化它。如果您实际进行远程处理,则应该只使用@Remote。你应该不惜一切代价避免远程操作。类似SOA的架构很慢,而且众所周知不可能扩展。只要坚持@Local,除非你有充分的理由不这样做。

  

在这种情况下,甚至@EJB也可以用@Inject替换   更一般的

是的,请随意@Inject您的EJB。您的JEE6容器(TomEE,JBoss7,GlassFish等)将能够解决这个问题。事实上,你应该问自己,我真的需要一个EJB吗?你能用纯CDI完成你的任务吗?只有在必须担心事务语义时才使用EJB,否则只使用CDI。

我希望有所帮助!