Eclipse下利用Maven创建SpringBoot的Restful风格程序

参考文章:https://spring.io/guides/gs/rest-service/

    中文翻译:https://blog.dubby.cn/detail.html?id=9040

 

1.目标是什么

构建一个web应用,我们可以请求:

 http://localhost:8080/greeting 

返回一个JSON

 {"id":1,"content":"Hello, World!"} 

还可以发起一个带参数的请求:

   http://localhost:8080/greeting?name=User 

返回一个JSON

 {"id":1,"content":"Hello, User!"} 

 

2.开始创建

2.1.Maven依赖

新建一个Maven项目

pom.xml文件

 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 2   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 3   <modelVersion>4.0.0</modelVersion>
 4   <groupId>com.niiam</groupId>
 5   <artifactId>SpringBootRestfulTest</artifactId>
 6   
 7   <version>0.0.1-SNAPSHOT</version>
 8   <name>SpringBootRestfulTest Maven Webapp</name>
 9   <url>http://maven.apache.org</url>
10   
11   <parent>
12         <groupId>org.springframework.boot</groupId>
13         <artifactId>spring-boot-starter-parent</artifactId>
14         <version>1.5.9.RELEASE</version>
15   </parent>
16   
17   <dependencies>
18     <dependency>
19         <groupId>org.springframework.boot</groupId>
20         <artifactId>spring-boot-starter-web</artifactId>
21     </dependency>
22     <dependency>
23         <groupId>org.springframework.boot</groupId>
24         <artifactId>spring-boot-starter-test</artifactId>
25         <scope>test</scope>
26     </dependency>
27     <dependency>
28         <groupId>com.jayway.jsonpath</groupId>
29         <artifactId>json-path</artifactId>
30         <scope>test</scope>
31     </dependency>
32   </dependencies>
33   
34   <properties>
35         <java.version>9.0.1</java.version>
36   </properties>
37   
38   <build>
39     <finalName>SpringBootRestfulTest</finalName>
40     <plugins>
41             <plugin>
42                 <groupId>org.springframework.boot</groupId>
43                 <artifactId>spring-boot-maven-plugin</artifactId>
44             </plugin>
45     </plugins>    
46   </build>
47   
48    <repositories>
49      <repository>
50          <id>spring-releases</id>
51          <url>https://repo.spring.io/libs-release</url>
52      </repository>
53    </repositories>
54    <pluginRepositories>
55       <pluginRepository>
56           <id>spring-releases</id>
57           <url>https://repo.spring.io/libs-release</url>
58       </pluginRepository>
59    </pluginRepositories>
60 </project>

其中,spring-boot-maven-plugin给我们提供了这么几个功能:

  • 他会把classpath下的jar统一打包成一个可直接运行的”über-jar”,方便我们运行。
  • 他会自动搜索public static void main()作为程序执行的入口。
  • 他内置一个依赖版本决定者。也就是他会指定依赖的版本。当然你也可以指定版本,如果你不指定,默认由他来决定版本。

2.2 实体类

根据

    {
        "id": 1,
        "content": "Hello, World!"
    }

 

来写出一个表达这个json的bean    src/main/java/hello/Greeting.java

 1 package hello;
 2 
 3 public class Greeting {
 4     private final long id;
 5     private final String content;
 6     public Greeting(long id, String content) {
 7         this.id = id;
 8         this.content = content;
 9     }
10     public long getId() {
11         return id;
12     }
13     public String getContent() {
14         return content;
15     }
16 }

Spring会使用Jackson JSON自动把Greeting的实例序列化成JSON

 

2.3 controller

在Spring构建的restful应用中,HTTP请求是由controller接收并处理的。想要创建一个controller可以使用@RestController修饰一个类,那么这个类就变成了一个controller。一个controller里的每个方法都可以接收一个特定的URI,需要使用@RequestMapping来修饰每个方法,来制定URI的路径,参数,方法等。

src/main/java/hello/GreetingController.java

 1 package hello;
 2 
 3 import java.util.concurrent.atomic.AtomicLong;
 4 import org.springframework.web.bind.annotation.RequestMapping;
 5 import org.springframework.web.bind.annotation.RequestParam;
 6 import org.springframework.web.bind.annotation.RestController;
 7 
 8 @RestController
 9 public class GreetingController {
10     private static final String template = "Hello, %s!";
11     private final AtomicLong counter = new AtomicLong();
12     @RequestMapping("/greeting")
13     public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
14         return new Greeting(counter.incrementAndGet(),
15                             String.format(template, name));
16     }
17 }

这个controller很简洁明了,但是在背后隐藏了很多事先细节,我们一点点来分解。

@RequestMapping这个注解确保/greeting这个HTTP请求会被路由到greeting()这个方法上来处理。

上面的例子没有指明GETPUST或者是PUT等HTTP方法,因为@RequestMapping默认是映射所有的方法。如果你只希望某个方法被映射到这个方法,可以使用@RequestMapping(method=GET)来缩小映射范围。

@RequestParam把请求参数中的name的值绑定到greeting()的参数name上。这个参数被标记为可选的,也就是可传可不传的,(默认情况下,required=true是必须要传的),在这里,如果没有传name,就会使用defaultValue的值。

greeting()方法里创建了一个Greeting对象,然后返回,用一个自增的int作为id,用name的值拼接成content

传统的MVC的controller和RESTful的controller的最大的区别就是返回的HTTP的response。传统的controller返回的是一个由后端渲染的HTML,而RESTful返回的是一个对象,然后被序列化成JSON字符串。

@RestController是Spring4新加的一个注解,用它修饰的controller返回的是一个对象(也就是JSON),而不是一个视图(也就是HTML)。这个注解等同于同时使用@Controller@ResponseBody

上面提到Spring会自动把对象转化成JSON,我们还不需要手动来转换,那么是谁帮我们做的呢?真相是,只要Jackson 2在classpath下,Spring就会使用MappingJackson2HttpMessageConverter来自动转换。

 

2.4 可执行Jar

虽然也可以打包成传统的war包然后交给servlet容器来执行,但是更多的时候是打包成一个可以直接执行的Jar。

src/main/java/hello/Application.java

1     package hello;
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     }

@SpringBootApplication注解等同于同时使用一下注解:

  • @Configuration修饰的类会被作为定义context上下文的bean。
  • @EnableAutoConfiguration允许Spring从配置文件,其他bean,等各种方式来加载bean。
  • 一般来说,对于Spirng MVC项目,你需要使用@EnableWebMvc,不过对于Spring Boot来说,只要你的classpath里包含spring-webmvc,他就会自动帮你加上这个,比如,设置DispatcherServlet
  • @ComponentScan告诉Spirng去扫描hello包下的其他组件,包含controller,service等。

main()就是这个应用的入口。发现了吗,整个应用没有一个XML文件,全部都是Java代码,没有任何配置,这就是Spring Boot想带给你的礼物。

 

右键点击Application.java,选择run as->java application,即可启动服务。

 

2.5 生成可执行Jar

右键点击项目->run as->Maven Install生成jar包,可能需要在项目设置里将JRE换成JDK

在command line输入:

java -jar SpringBootRestfulTest.jar

启动

 

在浏览器中输入:

http://localhost:8080/greeting?name=wangle

http://localhost:8080/greeting

 

需注意的是,此处启动的jar是包含了Tomcat服务器的

如需终止,可参考:如何优雅地停止运行中的内嵌Tomcat的Spring Boot应用 http://jaskey.github.io/blog/2016/04/05/shutdown-spring-boot-application-gracefully/

 

posted @ 2018-01-08 17:35  知乐  阅读(1979)  评论(0编辑  收藏  举报