在本教程中,我们将在 Spring Boot RESTful 应用中以 CSV 格式提供内容。 我们使用 OpenCSV 库。
Spring 是用于创建企业应用的流行 Java 应用框架。 Spring Boot 是 Spring 框架发展的下一步。 它有助于以最小的努力创建独立的,基于生产级的 Spring 应用。 它放弃了 XML 配置,并大量使用约定而不是配置原则。
CSV(逗号分隔值)是一种简单的数据格式,其中(大多数)值之间用逗号分隔,每一行代表一个记录。 数据存储在纯文本文件中。 作为电子表格和数据库中使用的导入和导出格式,它非常流行。 OpenCSV 是 Java 的开源,简单 CSV 解析器库。
Hibernate 是 Java 语言的对象关系映射框架。 它提供了一个框架,用于将面向对象的域模型映射到关系数据库。 对象关系映射(ORM)是一种编程技术,用于在面向对象的编程语言中的不兼容类型系统之间转换数据。
Spring Data Spring Data JPA 是 Spring Data 项目的一部分,该项目使实现基于 JPA 的存储库变得更加容易。 Spring Data JPA 使用 JPA 将数据存储在关系数据库中。 它可以在运行时从存储库界面自动创建存储库实现。
RESTFul 应用遵循 REST 体系结构样式,该样式用于设计网络应用。 RESTful 应用生成 HTTP 请求,这些请求对资源执行 CRUD(创建/读取/更新/删除)操作。
Spring Boot CSV 示例
我们的应用是一个 Spring Boot RESTful 应用,它以 CSV 格式从 H2 数据库返回数据。
这是项目结构。
pom.xml
这是 Maven 构建文件。 h2
依赖项添加了一个 H2 数据库驱动程序。 opencsv
依赖项添加了 OpenCSV 库的驱动程序。
Spring Boot 启动器是一组方便的依赖项描述符,我们可以在我们的应用中包含这些描述符。 它们极大地简化了 Maven 配置。 spring-boot-starter-parent
为 Spring Boot 应用提供了一些常用配置。 spring-boot-starter-web
是使用 Spring MVC 构建 Web(包括 RESTful)应用的入门工具。 它使用 Tomcat 作为默认的嵌入式容器。 spring-boot-starter-data-jpa
是将 Spring Data JPA 与 Hibernate 结合使用的入门工具。
在spring-boot-maven-plugin
提供了 Maven 的春季启动支持,使我们能够打包可执行的 JAR 或 WAR 档案。 它的spring-boot:run
目标运行春季启动应用。
application.yml
application.yml
文件包含 Spring Boot 应用的各种配置设置。 我们具有服务器端口和上下文路径(应用名称)的映射。 我们通过localhost:8086/rest/
URL 访问我们的应用。 使用banner-mode
属性,我们可以关闭 Spring 标语。
JPA database
值指定要操作的目标数据库。 在本例中,我们指定了 Hibernate 方言org.hibernate.dialect.H2Dialect
。 ddl-auto
是数据定义语言模式; create-drop
选项将自动创建和删除数据库模式。
H2 数据库在内存中运行。 另外,我们将 spring 框架的日志记录级别设置为 ERROR。 在application.yml
文件位于中src/main/resources
目录。
City.java
这是City
实体。 每个实体必须至少定义两件事:@Entity
注解和带有@Id
注解的 ID 字段。 我们已经将ddl-auto
选项设置为create-drop
,这意味着 Hibernate 将根据该实体创建表模式。
@Entity
注解指定该类是一个实体,并映射到数据库表。 @Table
实体指定要用于映射的数据库表的名称。
@Id
注解指定实体的主键,@GeneratedValue
提供规范主键值的生成策略。
import.sql
模式是由 Hibernate 自动创建的。 之后,将执行import.sql
文件以将数据填充到表中。
CityRepository.java
通过从 Spring CrudRepository
扩展,我们将为我们的数据存储库实现一些方法,包括findAll()
和findOne()
。 这样,我们节省了大量样板代码。
ICityService.java
ICityService
提供了获取所有城市并通过其 ID 从数据源获取城市的合同方法。
CityService.java
CityService
包含findAll()
和findById()
方法的实现。 我们使用存储库从数据库检索数据。
注入CityRepository
。
存储库的findAll()
方法返回城市列表。
存储库的findOne()
方法返回一个特定的城市对象。
MyCsvController.java
这是 Spring Boot RESTful 应用的控制器类。 @RestController
注解创建一个 RESTful 控制器。 传统的 MVC 控制器使用ModelAndView
,而 RESTful 控制器仅返回对象,并且对象数据通常以 JSON 或 XML 格式直接写入 HTTP 响应(通常)。 在本例中,我们选择了 CSV 格式。
我们在countryService
字段中插入ICityService
。
@RequestMapping
注解用于将 Web 请求映射到 Spring 控制器方法。 produces
选项设置媒体类型,在本例中为text/csv
。 我们将带有/cities
路径的请求映射到控制器的findCities()
方法。 默认请求是 GET 请求。
我们称cityService's
findAll()
来获取所有城市。 我们将 CSV 数据写入HttpServletResponse
对象。 Java Bean 与 CSV 数据的映射委托给WriteCsvToResponse
类。
在第二种方法中,我们有一个 URL 路径,其中包含要检索的城市的 ID。 我们使用@PathVariable
注解将 URL 模板变量绑定到方法cityId
参数。
WriteCsvToResponse.java
在WriteCsvToResponse
中,我们使用 OpenCSV 库将 Java bean 转换为 CSV,并将最终输出写入HttpServletResponse
中。
MappingStrategy
定义如何将 Java 属性映射到 CSV 列名称。 ColumnPositionMappingStrategy
使用列位置进行映射。
我们设置列名。
StatefulBeanToCsv
类以 CSV 格式写出 bean 给写程序,以保留状态信息并明智地猜测要应用的映射策略。
最后,编写了 bean。
Application.java
Application
设置 Spring Boot 应用。 @SpringBootApplication
启用自动配置和组件扫描。
使用mvn spring-boot:run
命令,运行应用。 该应用部署在嵌入式 Tomcat 服务器上。
使用curl
命令,我们可以获得所有城市。
在这里,我们得到了一个由其 ID 标识的城市。
在本教程中,我们已从 Spring Boot RESTful 应用以 CSV 格式将数据返回给客户端。 我们使用了 OpenCSV 库。