【问题标题】:CDI with JEE: how handle dependency injection in the backend without EJBCDI with JEE:如何在没有 EJB 的情况下处理后端的依赖注入
【发布时间】:2019-03-15 13:07:28
【问题描述】:

我正在使用 Java 开发 REST api,使用 JAX-RS、EJB、JPA 和 JasperReports,基本上 API 调用返回 id 的 oracle 函数,我使用该 id 进行选择并使用 Jasper Reports 生成报告,然后我将报告作为响应发送,工作正常。

但是,我对是否应该使用 EJB 有一些疑问,因为我不明白为什么在这种情况下应该使用 EJB,因为 oracle 函数内部有提交,如果出现问题,回滚由触发EJB不会什么都不做吧?另外,生成报告的选择很简单,只有一张表,我看到一些文章说,如果你只做一个选择,就不需要使用 EJB 来控制事务。

另外,在这种情况下如何使用 CDI?类中的@Named 和字段中的@Inject?我有一些同事说@Named 应该只与 JSF 一起使用,但我是一名大三学生,正在寻找关于这个的真相,经过大量研究后我仍然不知道如何处理这个问题,我感谢任何帮助。 谢谢!

【问题讨论】:

  • 我认为您在想象在没有 EJB 的情况下使用 EJB 会产生一些成本。当它也是一个可池化、可监控、可重用的对象时,您会将其视为事务管理器。在不增加解决方案复杂性的情况下,对于 CDI bean(此时)不能这样说。

标签: rest jax-rs ejb cdi


【解决方案1】:

我需要 EJB 来进行交易吗?

如果您使用的是 JEE-7+,那么您可以将 @Transactional 用于您的 CDI Bean,而不是带有 @Stateless 和 @TransactionManagement 和 @TransactionAttribute 的 EJB-Bean。 @Transactional 提供与@TransactionAttribute 相同的属性,并使任何CDI Bean 都具有事务性,而无需EJB 容器。所有这些方法都需要使用 JPA,这对于简单的单个查询来说可能是多余的。

https://docs.oracle.com/javaee/7/api/javax/transaction/Transactional.html

我可以用什么来代替 EJB 和 @Transactional?

如果您不需要/不想使用 EntityManager,则只需使用普通 JDBC。

@Named 有什么作用?

@Named 使 Java-EL 可以通过其定义的名称访问 CDI Bean,或者如果没有定义,则通过其简单的类名。您也可以使用 @Named 来区分实现,但我认为 CDI 限定符更适合实现这一点。所以,如果你不需要它,那就不要注释它。

如何向其他 CDI Bean 提供 CDI Bean?

在我看来,CDI Bean 应该通过字段而不是构造函数参数注入。构造函数参数的注入是因为可测试性完成的,因此您可以在不使用 CDI 的情况下测试您的 bean,这在如今已不难实现。

https://deltaspike.apache.org/documentation/test-control.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-01
    • 2020-12-08
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多