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

问题描述 投票:0回答:1

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

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

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

rest jax-rs ejb cdi
1个回答
0
投票

我是否需要EJB进行交易?

如果您使用的是JEE-7 +,则可以使用@Transactional作为CDI Bean而不是使用@Stateless和@TransactionManagement以及@TransactionAttribute的EJB-Beans。 @Transactional提供与@TransactionAttribute相同的属性,并在不需要EJB容器的情况下进行任何CDI Bean事务。所有这些方法都需要使用JPA,对于简单的单个查询而言可能是一种过度杀伤。

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

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

如果您不需要/想要使用EntityManager,那么只需使用纯JDBC即可。

@Named做什么?

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

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

在我看来,CDI Beans应该通过Fields而不是构造函数参数注入。构造函数参数中的注入由于可测试性而完成,因此您可以在不使用CDI的情况下测试bean,这些日子不再难以实现。

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

© www.soinside.com 2019 - 2024. All rights reserved.