原文: http://zetcode.com/articles/springbootrestsimple/

在本教程中,我们将创建一个简单的 Spring Boot RESTful 应用。 我们的应用将部署在嵌入式 Tomcat 服务器上。

我们展示了如何从 Web 服务中以 JSON 和 XML 格式返回数据。

Spring Boot

Spring 是用于创建企业应用的流行 Java 应用框架。 Spring Boot 是一种以最少的精力创建独立的,基于生产级别的基于 Spring 的应用的方法。

RESTFul 应用

RESTFul 应用创建遵循 REST 架构样式的系统(API),该系统用于设计联网应用。 RESTful 应用使用 HTTP 请求对资源执行 CRUD(创建/读取/更新/删除)操作。

Spring Boot RESTFul 简单示例

以下代码示例创建一个 Web 服务,该服务从 CSV 文件读取数据并将其以 JSON 格式返回给客户端。

  1. $ tree
  2. .
  3. ├── pom.xml
  4. └── src
  5. ├── main
  6. ├── java
  7. └── com
  8. └── zetcode
  9. ├── Application.java
  10. ├── bean
  11. └── Country.java
  12. ├── controller
  13. └── MyController.java
  14. └── service
  15. ├── CountryService.java
  16. └── ICountryService.java
  17. └── resources
  18. ├── application.yml
  19. └── countries.csv
  20. └── test
  21. └── java

这是项目结构。

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  5. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  6. <modelVersion>4.0.0</modelVersion>
  7. <groupId>com.zetcode</groupId>
  8. <artifactId>SpringBootRest</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <packaging>jar</packaging>
  11. <name>SpringBootRest</name>
  12. <properties>
  13. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  14. <maven.compiler.source>1.8</maven.compiler.source>
  15. <maven.compiler.target>1.8</maven.compiler.target>
  16. </properties>
  17. <parent>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-parent</artifactId>
  20. <version>1.5.3.RELEASE</version>
  21. </parent>
  22. <dependencies>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-web</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>com.opencsv</groupId>
  29. <artifactId>opencsv</artifactId>
  30. <version>3.8</version>
  31. </dependency>
  32. </dependencies>
  33. <build>
  34. <plugins>
  35. <plugin>
  36. <groupId>org.springframework.boot</groupId>
  37. <artifactId>spring-boot-maven-plugin</artifactId>
  38. </plugin>
  39. </plugins>
  40. </build>
  41. </project>

这是 Maven 构建文件。 opencsv用于处理 CSV 数据。 spring-boot-starter-web是用于构建 Web 和 RESTful 应用的入门工具。 该应用打包到可执行的 JAR 文件中。 可执行 JAR 是使用spring-boot-maven-plugin创建的。

application.yml

  1. server:
  2. port: 8086
  3. contextPath: /rest

application.yml文件包含 Spring Boot 应用的各种配置设置。 我们具有服务器端口和上下文路径(应用名称)的映射。 该文件位于src/main/resources目录中。

countries.csv

  1. Country, Population
  2. Slovakia,5429000
  3. Norway,5271000
  4. Croatia,4225000
  5. Russia,143439000
  6. Mexico,122273000
  7. Vietnam,95261000
  8. Sweden,9967000
  9. Iceland,337600
  10. Israel,8622000
  11. Hungary,9830000
  12. Germany,82175700
  13. Japan,126650000

src/main/resources目录中的countries.csv包含我们的应用中使用的数据。

Country.java

  1. package com.zetcode.bean;
  2. public class Country {
  3. private String name;
  4. private int population;
  5. public Country() {
  6. }
  7. public Country(String name, int population) {
  8. this.name = name;
  9. this.population = population;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public int getPopulation() {
  18. return population;
  19. }
  20. public void setPopulation(int population) {
  21. this.population = population;
  22. }
  23. }

countries.csv文件中的字段映射到Country类。

ICountryService.java

  1. package com.zetcode.service;
  2. import com.zetcode.bean.Country;
  3. import java.util.ArrayList;
  4. public interface ICountryService {
  5. public ArrayList<Country> findAll();
  6. }

这是ICountryService接口。 它包含一种称为findAll()的方法。

CountryService.java

  1. package com.zetcode.service;
  2. import com.opencsv.CSVReader;
  3. import com.zetcode.bean.Country;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileNotFoundException;
  7. import java.io.IOException;
  8. import java.io.InputStreamReader;
  9. import java.util.ArrayList;
  10. import java.util.logging.Level;
  11. import java.util.logging.Logger;
  12. import org.springframework.stereotype.Service;
  13. @Service
  14. public class CountryService implements ICountryService {
  15. private final ArrayList<Country> countries;
  16. public CountryService() {
  17. countries = new ArrayList();
  18. }
  19. @Override
  20. public ArrayList<Country> findAll() {
  21. FileInputStream fis = null;
  22. try {
  23. String fileName = "src/main/resources/countries.csv";
  24. fis = new FileInputStream(new File(fileName));
  25. CSVReader reader = new CSVReader(new InputStreamReader(fis));
  26. String[] nextLine;
  27. reader.readNext();
  28. while ((nextLine = reader.readNext()) != null) {
  29. Country newCountry = new Country(nextLine[0],
  30. Integer.valueOf(nextLine[1]));
  31. countries.add(newCountry);
  32. }
  33. } catch (FileNotFoundException ex) {
  34. Logger.getLogger(CountryService.class.getName()).log(Level.SEVERE, null, ex);
  35. } catch (IOException ex) {
  36. Logger.getLogger(CountryService.class.getName()).log(Level.SEVERE, null, ex);
  37. } finally {
  38. try {
  39. if (fis != null) {
  40. fis.close();
  41. }
  42. } catch (IOException ex) {
  43. Logger.getLogger(CountryService.class.getName()).log(Level.SEVERE, null, ex);
  44. }
  45. }
  46. return countries;
  47. }
  48. }

这是ICountryService契约的执行。 它包含findAll()方法,该方法从countries.csv文件中读取数据并返回Country对象的列表。

MyController.java

  1. package com.zetcode.controller;
  2. import com.zetcode.bean.Country;
  3. import com.zetcode.service.ICountryService;
  4. import java.util.List;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RestController;
  8. @RestController
  9. public class MyController {
  10. @Autowired
  11. private ICountryService countryService;
  12. @RequestMapping("/countries")
  13. public List<Country> listCountries() {
  14. return countryService.findAll();
  15. }
  16. }

这是 Spring Boot RESTful 应用的控制器类。 @RestController注解创建一个 RESTful 控制器。 传统的 MVC 控制器使用ModelAndView,而 RESTful 控制器仅返回对象,并且对象数据以 JSON 或 XML 格式直接写入 HTTP 响应。

  1. @Autowired
  2. private ICountryService countryService;

我们将CountryService注入countryService变量中。

  1. @RequestMapping("/countries")
  2. public List<Country> listCountries() {
  3. return countryService.findAll();
  4. }

@RequestMapping注解用于将 Web 请求映射到 Spring 控制器方法。 在这里,我们将具有/countries路径的请求映射到控制器的listCountries()方法。 默认请求是 GET 请求。

我们不需要手动将Country域对象转换为 JSON。 因为 Jackson 2 在类路径上,所以 Spring 自动选择MappingJackson2HttpMessageConverterCountry实例转换为 JSON。

Application.java

  1. package com.zetcode;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class Application {
  6. public static void main(String[] args) {
  7. SpringApplication.run(Application.class, args);
  8. }
  9. }

Application设置 Spring Boot 应用。 @SpringBootApplication启用自动配置和组件扫描。

  1. $ mvn package

使用mvn package命令,构建应用。

  1. $ mvn spring-boot:run

使用mvn spring-boot:run命令,运行应用。 该应用部署在嵌入式 Tomcat 服务器上。

  1. $ curl localhost:8086/rest/countries
  2. [{"name":"Slovakia","population":5429000},{"name":"Norway","population":5271000},
  3. {"name":"Croatia","population":4225000},{"name":"Russia","population":143439000},
  4. {"name":"Mexico","population":122273000},{"name":"Vietnam","population":95261000},
  5. {"name":"Sweden","population":9967000},{"name":"Iceland","population":337600},
  6. {"name":"Israel","population":8622000},{"name":"Hungary","population":9830000},
  7. {"name":"Germany","population":82175700},{"name":"Japan","population":126650000}]

使用curl命令,测试应用。

返回 XML 数据

要返回 XML 数据而不是 JSON,我们需要添加一个依赖项并修改控制器。

  1. <dependency>
  2. <groupId>com.fasterxml.jackson.dataformat</groupId>
  3. <artifactId>jackson-dataformat-xml</artifactId>
  4. </dependency>

我们将jackson-dataformat-xml添加到依赖项。

MyController.java

  1. package com.zetcode.controller;
  2. import com.zetcode.bean.Country;
  3. import com.zetcode.service.ICountryService;
  4. import java.util.List;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.http.MediaType;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RequestMethod;
  9. import org.springframework.web.bind.annotation.RestController;
  10. @RestController
  11. public class MyController {
  12. @Autowired
  13. private ICountryService countryService;
  14. @RequestMapping(value="/countries", method=RequestMethod.GET,
  15. produces=MediaType.APPLICATION_XML_VALUE)
  16. public List<Country> listCountries() {
  17. return countryService.findAll();
  18. }
  19. }

我们选择MediaType.APPLICATION_XML_VALUE类型来告诉控制器返回 XML 数据。

在本教程中,我们创建了一个 Spring Boot RESTful 应用,该应用以 JSON 和 XML 返回数据。 您可能也对相关教程感兴趣: Spring Boot H2 REST 教程Spring Web 应用简介独立的 Spring 应用OpenCSV 教程在经典的 Spring 应用中使用 HikariCP 连接池JdbcTemplate