这里介绍如何快速通过maven构建基于springmvc的rest风格api。
1、构建maven项目,这里没有必要构建web项目,可以构建一个非web的maven项目,配置上jetty的maven插件依赖,直接通过jetty插件来运行,加入spring-context-support,spring-webmvc,jackson-databind,javax.servlet-api,slf4j-log4j12(可选)依赖。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.4</version>
</dependency>
在build节点中,配置jetty插件依赖:
<build>
<finalName>springmvc</finalName>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>8.1.16.v20140903</version>
<configuration>
<reload>manual</reload>
<webAppConfig>
<contextPath>/${project.build.finalName}</contextPath>
</webAppConfig>
<connectors>
<connector implementation="org.eclipse.jetty.server.nio
.SelectChannelConnector">
<port>8080</port>
</connector>
</connectors>
</configuration>
</plugin>
</plugins>
</build>
配置好了,保存的时候,会下载很多jar包,网络正常情况下,不出一分钟。
2、编写AppConfig.java,该类的作用类似于我们在web项目中配置springmvc-servlet.xml 指定我们需要开启mvc注解,扫描controller控制器所在文件夹。
package com.xxx.web;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@EnableWebMvc
@ComponentScan
public class AppConfig {}
AppInitializer.java,该类的作用相当于webapp中的web.xml文件,配置org.springframework.web.servlet.DispatchServlet。
package com.xxx.web;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration.Dynamic;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
public class AppInitializer implements WebApplicationInitializer {
private static final Logger log = LoggerFactory.getLogger(AppInitializer.class);
@Override
public void onStartup(ServletContext context) throws ServletException {
AnnotationConfigWebApplicationContext applicationContext =
new AnnotationConfigWebApplicationContext();
applicationContext.register(AppConfig.class);
DispatcherServlet dispatcherServlet = new DispatcherServlet(applicationContext);
Dynamic addServlet = context.addServlet("dispatcherServlet", dispatcherServlet);
addServlet.addMapping("/");
log.info("webapp initialized ok.");
}
}
编写一个实体类User,用来做数据传输。
package com.xxx.web.domain;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String username;
private boolean status=Boolean.TRUE;
...省略get,set,toString,hashCode,equals方法
}
User类中主要就三个属性id,name,status。
编写主要的UserController.java
package com.xxx.web.controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.xxx.web.domain.User;
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping(value="/{id}",method=RequestMethod.GET)
public User get(@PathVariable("id") Integer id){
User user = new User(id,"springmvc-restful");
return user;
}
}
就这样,所有的代码就编写完毕,如果编译没有报错的话,我们可以进行测试了。
3、在命令行下进入项目所在目录,输入mvn jetty:run开始运行。
4、打开浏览器,在地址栏中输入地址:http://localhost:8080/springmvc/user/1,即可看到返回的json数据。
5、如果启动jetty没有问题,访问http://localhost:8080/springmvc/user/1出现404 :No mapping found for HTTP request with URI [/springmvc/user/1] in dispatcherServlet with name 'dispatcherServlet'的问题,检查一下AppConfig.java所在包是否在controller包的外面,如果不在controller包的外面,需要在@ComponentScan注解上加上@ComponentScan(basePackages={"com.xxx.web.controller"})这样的配置,指向controller文件夹所在的位置。
最后,启动jetty,发现我们所需要访问的uri出现在启动日志中,如下图所示,说明我们的配置生效了。
至此,基于springmvc构建的Rest风格应用就完成了。