我认为可以说Java EE在Java开发人员中声名狼藉。尽管多年来它在所有方面都有所改进,甚至将其官网从Eclipse基金会改为Jakarta EE,但它仍然让人感到很不方便。另一方面,我们拥有Spring Framework(能更好的反应实际问题,一个成熟的Spring平台),这是一个出色的,轻量级的,快速的,创新的,高效的Java EE替代品。那么为什么还要用Java EE呢?
我们将通过展示使用大多数Java EE规范构建现代Java应用程序是多么容易来回答这个问题。而且,成功的关键因素是Eclipse Microprofile:微服务时代的企业Java。
我们要构建的应用程序是用于管理人员的RESTful Web API。在Java中构建RESTful Web服务的标准方法是使用JAX-RS 2.1(JSR-370)。因此,CDI 2.0(JSR-365)是负责依赖注入,而JPA 2.0(JSR-317)将覆盖数据访问层。当然,Bean Validation 2.0(JSR-380)用来帮助我们处理输入验证。
我们将依赖的唯一非Java EE规范是OpenAPI v3.0,它有助于提供RESTful Web API的可用描述。有了这个,让我们开始使用thePersonEntity域模型(省略getter和setter):
它只有绝对最小的属性集。 JPA存储库非常简单,并实现了一组典型的CRUD方法。
事务管理(即@Transactionalannotation)需要解释一下。 在典型的Java EE应用程序中,容器负责运行时管理事务。 由于我们不希望登录应用程序容器,我们可以使用EntityManager来启动/提交/回滚事务。这样肯定可以,但同时它也会污染代码。 可以说,更好的选择是使用Apache DeltaSpikeCDI扩展进行声明式事务管理(这是@Transactional和@EntityManagerConfig注释的来源)。 下面的代码段说明了它是如何集成的。
接下来将出现ThePerson数据传输对象和服务层。
老实说,为了保持示例应用程序尽可能小,我们可以完全跳过服务层并直接转到存储库。 但总的来说,这不是一个很好的做法,所以让我们介绍一下PeopleServiceImpl。
剩下的唯一部分是JAX-RS应用程序和资源的定义。
JAX-RS资源实现虽然有点有趣,但是我们让它尽可能简单点。
有了这个,我们就完成了! 但是,我们怎样才能将所有这些部件组装在一起? 这时我们引入Microprofile。 有许多实现可供选择,这里使用的是Project Hammock。 我们唯一要做的就是指定我们想要使用的CDI 2.0,JAX-RS 2.1和JPA 2.0实现,分别转换为Weld,Apache CXF和OpenJPA(通过Project Hammock依赖项表示)。 我们来看看Apache Maven pom.xml文件。
让我们立即构建并运行应用程序。
确保我们的人员管理RESTful Web API完全正常运行的最佳方法是向其发送一些请求:
如何确保Bean验证工作正常? 要触发它,让我们发送部分准备好的请求。
到目前为止,我们还没有谈到测试我们的应用程序。 提出集成测试有多难,比方说,添加一个人的场景? 事实证明,围绕测试Java EE应用程序的框架已经有了很大的改进。 特别是,使用Arquillian测试框架(以及心爱的JUnit和REST Assured)非常容易实现。示例如下,
完成了! 实际上,开发现代Java EE应用程序真的很有趣! 事实上,与Spring的相似之处并非巧合,因为它将继续激发Java EE生态系统的创新。