使用JEE的CDI:如何在没有EJB的情况下处理后端的依赖项注入

时间:2019-03-15 13:07:28

标签: rest jax-rs ejb cdi

我正在使用Java使用REST api,使用JAX-RS,EJB,JPA和JasperReports,基本上,该API调用了一个返回ID的oracle函数,该ID我选择并使用Jasper Reports生成报告,然后我将报告作为回应发送,效果很好。

但是,我是否应该使用EJB有一些问题,因为我不明白为什么在这种情况下我应该使用EJB,因为oracle函数已经在其中进行了提交,如果出现问题,回滚将由EJB会无所作为吗?另外,生成报告的选择很简单,只有一个表,而且我看到一些文章说,如果仅执行选择,则无需使用EJB来控制事务。

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

1 个答案:

答案 0 :(得分:0)

我是否需要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使CDI Bean可以通过其定义的名称访问Java-EL,如果没有定义,则可以通过其简单的类名称访问。您还可以使用@Named来区分实现,但是我认为CDI限定符更适合实现这一点。因此,如果您不需要它,请不要对其进行注释。

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

我认为CDI Bean应该通过Fields而不是构造函数参数注入。出于可测试性的考虑,构造函数参数的注入是完成的,因此您无需使用CDI就可以测试bean,如今,这已经变得不那么困难了。

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