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控制器使用 ModelAndViewRESTful控制器仅返回对象和对象数据直接写入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应用程序.
2664

被折叠的 条评论
为什么被折叠?



