Spring 框架提供了一个直观且易于使用的模型来公开您的数据,使用 RESTful Web 服务,这是微服务之间 API 通信的事实标准。
我们将在本节中使用的版本 2.0.5 自动将 CRUD 操作公开为 RESTful API。
正如我们在 Repository – JPA 部分中所描述的,我们的 FootballPlayerRepository 接口扩展了 org.springframework.data.repository.CrudRepository,它从该接口继承以下方法:
使用 Spring Data Rest 模块,正如我之前提到的,您可以自动公开这些方法。为此,您应该将 spring-boot-starter-data-rest 依赖项插入到 Maven pom.xml 文件中,如下所示:
然后编译并运行你的项目,如下:
您将能够获取应用程序中可用 API 的链接。如果您打开浏览器并调用 http://localhost:8080/,您将获得指向 http://localhost:8080/footballPlayers 的链接,如以下屏幕截图:
通过调用 http://localhost:8080/footballPlayers,您将获得存储在应用程序中的足球运动员列表,如下所示:
否则,在本节中,我们将定义旧式方法:我将创建一个服务和控制器类,以便调用 JPA 层(存储库)并公开 API。由于 SpringFox 框架中存在错误,无法使用 Swagger 来记录 API, 是良好微服务的关键特性之一。因此,我将遵循前面描述的方案,同时等待错误得到解决。
首先,我将创建一个服务类,用于解耦 REST API 控制器和数据访问层之间的业务逻辑。我只会实现基本的 CRUD 方法,而不是 CRUD 存储库接口提供的所有集合。
在我们的例子中,它的实现非常简单,而且看起来只是一个传递;在实际生产用例中,您可以使用业务逻辑操作,以坚持职责分离模式:
现在我们将使用 RESTful Web 服务公开我们的服务方法,如下所示:
如您所见,我们定义了以下内容:
- The API paths
- The API parameters
- The producers and consumers payload types
现在我们可以调用检索足球运动员列表的 API,如下所示:
输出应该类似于以下内容(为方便起见,我们只显示了部分代码):
最后,我们将创建 JUnit 测试,以确保我们的 API 正常工作。
让我们添加 Maven 依赖项,如下所示:
像往常一样,我没有指定版本,因为它是由 spring-boot-starter-parent BOM 自动处理的。
接下来,我将在由 Spring Initializr 实用程序创建的类 com.packtpub.springboot.footballplayermicroservice.FootballPlayerMicroserviceApplicationTests 中构建测试方法。
test 类如下所示:
让我们分析一下课程中最重要的部分。
我将使用 SpringRunner 类运行测试套件,正如在 @RunWith 注释中定义的那样。 SpringRunner 是 SpringJUnit4ClassRunner 类的别名,它具有创建 Spring 上下文和执行测试所需的实用程序。
我决定实现一个集成测试,所以我没有模拟任何东西;相反,我调用了真正的方法。
为此,我需要创建一个真正的 Spring 执行环境。使用 @SpringBootTest 注释,我将类设置为启动(在我们的例子中为 FootballPlayerMicroserviceApplication.class),以及执行嵌入式 servlet 容器的随机端口。
最后,我必须以明确定义的顺序执行测试,以避免与缺少测试记录相关的失败。为了做到这一点,我设置了 FixMethodOrder(MethodSorters.NAME_ASCENDING)。这样,Spring 根据方法的名称执行测试。这就是在方法名称中使用升序数字的原因。