在本示例中,我们将使用最新的Spring 4 MVC中提供的@RestController
,使用最少的代码来构建一个Restful Web Service,支持返回xml
或json
数据,这个可以让用户选择,通过URL后缀.xml
或.json
来完成。
使用的组件版本:
Spring 4.1.7.RELEASE
jackson-core 2.5.4
jackson-databind 2.5.4
我们先来看一下@RestController
的源码:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Controller @ResponseBody public @interface RestController { String value() default ""; }
可以看到,上面包含了@Controller
和@ResponseBody
这两个注解,使用spring 3实现过restful的同学应该马上就知道它的具体作用了。
下面来看看具体实现。
添加maven依赖,依赖的jackson
组件跟之前版本的jackson-mapper-asl
有所区别,具体可以看maven的pom文件:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>4.1.7.RELEASE</spring.version> <jackson-core.version>2.5.4</jackson-core.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</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-core</artifactId> <version>${jackson-core.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson-core.version}</version> </dependency> </dependencies>
编写返回数据的实体类:
public class Message { private String name; private String text; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getText() { return text; } public void setText(String text) { this.text = text; } }
建立Controller
,当然上面要添加@RestController
注解:
@RestController public class DemoRestController { @RequestMapping("say/{name}") public Message say(@PathVariable String name) { Message message = new Message(); message.setName(name); message.setText("hello," + name); return message; } }
到这里主要的工作就完成了,对就这么简单,不需要其它任何关于Restful的配置。
当然了,spring本身的配置扫描包路径和修改web.xml还是省不了的,
<context:component-scan base-package="com.dexcoder.spring.demo"> </context:component-scan> <mvc:annotation-driven/>
web.xml添加spring mvc配置:
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
用tomcat:run
命令使用maven的tomcat插件启动项目,
输入地址访问 http://localhost:8080/Spring4RestfulDemo/say/liyd.json,
也可以省去json后缀,http://localhost:8080/Spring4RestfulDemo/say/liyd,
因为默认就是json,结果如下:
但是当我们访问http://localhost:8080/Spring4RestfulDemo/say/liyd.xml
却出现406错误:The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers ().
这是因为在转换xml出错了,只需要给实体类加上@XmlRootElement
注解即可:
@XmlRootElement public class Message { //...... }
重启后再次访问http://localhost:8080/Spring4RestfulDemo/say/liyd.xml,结果如下:
需要注意这时如果url地址不加后缀,默认变成了返回xml数据而不是原来的json。
Demo源码下载: