本指南将引导你完成使用Spring创建“hello World”RESTful Web服务的过程。
创建一个资源表示类
该服务将处理GET请求/greeting,可选地使用查询字符串中的name参数。改GET请求应该返回200 OK的响应,和表示问候的JSON格式的正文。它应该看起来像这样:
{ "id": 1, "content": "Hello, World!" }
id字段是问候语的唯一标识符,content是问候语文字表示。
要建模问候表示,你创建一个资源表示类。提供一个普通java对象,有字段,构造函数,id和content数据的访问器。
package com.example.demo.entity; public class Greeting { private long id; private String content; public Greeting(long id, String content) { this.id = id; this.content = content; } public long getId() { return id; } public String getContent() { return content; } }
如你所见,下面的步骤中,Spring使用JSON库自动将Greeting类型的实例序列化为JSON。
接下来,创建提供这些问候的资源控制器。
创建一个资源控制器
这个控制器简洁明了,但有很多事情发生在幕后。让我们一步一步地把它分解。
@RequestMapping 注释确定将http请求 /greeting 映射到 greeting() 方法。
上面的例子没有指定GET、PUT、POST,因为@RequestMapping 默认映射所有的http操作。使用@RequestMapping(method=GET) 来缩小这种映射。
@RequestParam 将查询字符串参数 name 的值绑定到 greeting() 方法的 name 参数。这个查询字符串参数被显式地标记为可选(required=true 默认):如果请求中缺少,defaultValue
默认值“World”被使用。
方法体的实现,创建并返回一个新的 Greeting 对象,使用 id 和 content属性,id 基于 counter 的下一个值,content 基于把给定的 name 使用欢迎 template 格式化的值。
传统的MVC控制器和上面的RESTful web服务控制器之间的关键区别是http响应体的创建方式。RESTful web service controller 不依赖视图技术,在服务端执行将数据渲染成HTML,而是简单地填充并返回一个 Greeting对象。对象数据将以json形式直接写入http响应。
这段代码使用了Spring4的新注释@RestController,它将类标记为一个控制器,其中每个方法都返回一个域对象而不是一个视图。它是@Controller和@ResponseBody的速记(缩写)。
Greeting对象必须转换为json。由于Spring的HTTP消息转换器(Spring’s HTTP message converter)支持,你不需要手动执行此转换。因为 Jackson 2 在类路径上,Spring 的 MappingJackson2HttpMessageConverter 被自动选择将 Greeting 实例转换为JSON。
使应用程序可执行
尽管可以打包此服务成传统传统WAR文件,部署到外部应用服务器;但下面演示的更简单的方法,创建一个独立的应用程序。你把所有内容打包到一个单独的、可执行的JAR文件中,由一个好的旧Java main() 方法驱动。在此过程中,你使用Spring支持的内置的Tomcat servlet容器作为HTTP运行时,而不是部署到外部实例。
srcmainjavacomexampledemoRestfulWebServiceApplication.java
package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class RestfulWebServiceApplication { public static void main(String[] args) { SpringApplication.run(RestfulWebServiceApplication.class, args); } }
@SpringBootApplication是一个方便的注释,它包括@Configuration、@EnableAutoConfiguration、@EnableWebMvc、@ComponentScan。
@Configuration将该类标记为应用程序上下文的bean定义的来源。
@EnableAutoConfiguration告诉Spring Boot根据类路径设置、其他bean、各种属性设置,添加bean。
通常情况下,你需要为一个Spring MVC应用添加@EnableWebMvc,但是Spring Boot在classpath(类路径)中看到 spring-webmvc 时自动添加它。这将该应用程序标记为Web应用程序,并激活关键行为,如设置DespatcherServlet。
@ComponentScan告诉Spring在该类属于的包(com.example.demo)中查找其他组件、配置、服务,以便找到控制器。
main()方法使用 Spring Boot 的 SpringApplication.run() 方法来启动应用程序。
你有没有注意到没有一行XML?没有web.xml。这个Web应用程序是100%纯Java,你不必配置任何管道或基础设施。
构建一个可执行的JAR
你可以使用Maven从命令行运行应用程序。或者你可以构建一个包含所有必需的的依赖项,类和资源的单一的可执行JAR文件,然后运行该文件。这使得在整个开发生命周期中、在不同的环境中,运送、版本化和将服务作为应用程序发布,变得容易。
如果你正在使用Maven,你可以使用 ./mvnw spring-boot:run 运行该应用程序。或者你可以用 ./mvnw clean package 构建JAR文件。然后你可以运行JAR文件:
java -jar target/restfulwebservice-0.1.0.jar
上面的过程将创建一个可运行的JAR。你也可以选择构建一个经典的WAR文件。
显示日志输出。该服务应该在几秒钟内启动并运行。
测试服务
现在服务已经启动, 访问 http://localhost:8080/greeting ,在这里你看到:
{"id":1,"content":"Hello, World!"}
提供查询字符串参数 name ,http://localhost:8080/greeting?name=User。
注意 content 属性的值是,如何从“Hello,World!”变为“Hello User!”:
{"id":2,"content":"Hello, User!"}
这一变化表明,GreetingController 中配置的 @RequestParam 按预期地工作着。name参数被赋予了默认值“World”,但总是可以通过查询字符串被显式覆盖。
注意 id 属性如何从1变为2。这证明,跨多个请求处理,倚靠同一个实例(GreetingController),并且它的 counter 字段在每次调用时递增,按预期地。
概要
恭喜!您刚刚用Spring开发了一个RESTful Web服务。