Spring Boot RESTFul风格 应用程序
在本教程中,我们将创建一个简单的弹簧引导RESTful应用程序。我们的应用程序将被部署在一个嵌入式Tomcat服务器。
我们展示如何返回JSON和XML格式的数据从我们的web服务。
春天的引导
春天是一个流行的Java应用程序创建企业应用程序的框架。春天的引导是一种创建独立的、基于工业生产弹簧的应用程序以最小的努力。
RESTFul应用程序
RESTFul应用程序创建了一个系统(API)遵循REST架构风格,用于设计网络应用程序。RESTful应用程序使用HTTP请求执行CRUD(创建/读取/更新/删除)操作资源。
弹簧引导宁静的简单的例子
下面的代码示例创建了一个web服务,它从CSV文件中读取数据并将其以JSON格式返回给客户机。
$ tree . ├── pom.xml └── src ├── main │ ├── java │ │ └── com │ │ └── zetcode │ │ ├── Application.java │ │ ├── bean │ │ │ └── Country.java │ │ ├── controller │ │ │ └── MyController.java │ │ └── service │ │ ├── CountryService.java │ │ └── ICountryService.java │ └── resources │ ├── application.yml │ └── countries.csv └── test └── java
这是项目结构。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zetcode</groupId> <artifactId>SpringBootRest</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>SpringBootRest</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.3.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.opencsv</groupId> <artifactId>opencsv</artifactId> <version>3.8</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
这是Maven构建文件。的 opencsv
用于处理CSV数据。的 spring-boot-starter-web
是构建web的起动器和基于rest的应用程序。应用程序打包成一个可执行的JAR文件。与创建可执行JAR spring-boot-maven-plugin
.
server: port: 8086 contextPath: /rest
的 application.yml
文件包含各种弹簧启动应用程序的配置设置。我们已经为服务器端口映射和上下文路径(应用程序名称)。该文件位于 src/main/resources
目录中。
Country, Population Slovakia,5429000 Norway,5271000 Croatia,4225000 Russia,143439000 Mexico,122273000 Vietnam,95261000 Sweden,9967000 Iceland,337600 Israel,8622000 Hungary,9830000 Germany,82175700 Japan,126650000
的 countries.csv
位于 src/main/resources
目录,包含在我们的应用程序中使用的数据。
package com.zetcode.bean; public class Country { private String name; private int population; public Country() { } public Country(String name, int population) { this.name = name; this.population = population; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPopulation() { return population; } public void setPopulation(int population) { this.population = population; } }
的字段 countries.csv
文件被映射到 Country
类。
package com.zetcode.service; import com.zetcode.bean.Country; import java.util.ArrayList; public interface ICountryService { public ArrayList<Country> findAll(); }
这是 ICountryService
接口。它包含一个方法调用 findAll()
.
package com.zetcode.service; import com.opencsv.CSVReader; import com.zetcode.bean.Country; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; import org.springframework.stereotype.Service; @Service public class CountryService implements ICountryService { private final ArrayList<Country> countries; public CountryService() { countries = new ArrayList(); } @Override public ArrayList<Country> findAll() { FileInputStream fis = null; try { String fileName = "src/main/resources/countries.csv"; fis = new FileInputStream(new File(fileName)); CSVReader reader = new CSVReader(new InputStreamReader(fis)); String[] nextLine; reader.readNext(); s while ((nextLine = reader.readNext()) != null) { Country newCountry = new Country(nextLine[0], Integer.valueOf(nextLine[1])); countries.add(newCountry); } } catch (FileNotFoundException ex) { Logger.getLogger(CountryService.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(CountryService.class.getName()).log(Level.SEVERE, null, ex); } finally { try { if (fis != null) { fis.close(); } } catch (IOException ex) { Logger.getLogger(CountryService.class.getName()).log(Level.SEVERE, null, ex); } } return countries; } }
这是实现的 ICountryService
合同。它包含了 findAll()
读取数据的方法 countries.csv
文件,并返回一个列表 Country
对象。
package com.zetcode.controller; import com.zetcode.bean.Country; import com.zetcode.service.ICountryService; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class MyController { @Autowired private ICountryService countryService; @RequestMapping("/countries") public List<Country> listCountries() { return countryService.findAll(); } }
这是春天的控制器类启动基于rest的应用程序。的 @RestController
注释创建一个RESTful控制器。在传统的MVC控制器使用 ModelAndView
RESTful控制器仅返回对象和对象数据直接写入HTTP响应在JSON或XML格式。
@Autowired private ICountryService countryService;
我们注入 CountryService
到 countryService
变量。
@RequestMapping("/countries") public List<Country> listCountries() { return countryService.findAll(); }
的 @RequestMapping
注释用于web请求映射到春天的控制器方法。在这里我们映射的请求 /countries
控制器的道路 listCountries()
方法。默认请求一个GET请求。
我们不需要转换 Country
域对象手工JSON。因为杰克逊2类路径中,春天的选择MappingJackson2HttpMessageConverter
自动转换 Country
实例JSON。
package com.zetcode; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
的 Application
设置弹簧启动应用程序。的 @SpringBootApplication
支持自动配置和组件扫描。
$ mvn package
与 mvn package
命令,我们构建应用程序。
$ mvn spring-boot:run
与 mvn spring-boot:run
命令,我们运行应用程序。嵌入应用程序部署在Tomcat服务器。
$ curl localhost:8086/rest/countries [{"name":"Slovakia","population":5429000},{"name":"Norway","population":5271000}, {"name":"Croatia","population":4225000},{"name":"Russia","population":143439000}, {"name":"Mexico","population":122273000},{"name":"Vietnam","population":95261000}, {"name":"Sweden","population":9967000},{"name":"Iceland","population":337600}, {"name":"Israel","population":8622000},{"name":"Hungary","population":9830000}, {"name":"Germany","population":82175700},{"name":"Japan","population":126650000}]
与 curl
命令,我们测试应用程序。
返回XML数据
JSON返回XML数据相反,我们需要添加一个依赖项和修改控制器。
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency>
我们添加 jackson-dataformat-xml
的依赖关系。
package com.zetcode.controller; import com.zetcode.bean.Country; import com.zetcode.service.ICountryService; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController public class MyController { @Autowired private ICountryService countryService; @RequestMapping(value="/countries", method=RequestMethod.GET, produces=MediaType.APPLICATION_XML_VALUE) public List<Country> listCountries() { return countryService.findAll(); } }
我���选择的 MediaType.APPLICATION_XML_VALUE
告诉控制器返回的XML数据类型。
在本教程中,我们已经创建了一个弹簧引导RESTful应用程序返回JSON和XML数据。你可能也会感兴趣的相关教程:弹簧引导H2其他教程,介绍Spring web应用程序,独立的Spring应用程序,OpenCSV教程,使用HikariCP连接池,JdbcTemplate在一个典型的Spring应用程序.