Spring 4 MVC中使用@RestController来构建Restful Web Service

分类: Spring 4人评论 selfly 1年前发布

在本示例中,我们将使用最新的Spring 4 MVC中提供的@RestController,使用最少的代码来构建一个Restful Web Service,支持返回xmljson数据,这个可以让用户选择,通过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,结果如下:

image

但是当我们访问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,结果如下:

image

需要注意这时如果url地址不加后缀,默认变成了返回xml数据而不是原来的json。

Demo源码下载:

附件列表

上一篇:
下一篇:

你可能感兴趣的文章

4 条评论
l7810 · 1年前
.xml方式,依然还是报406错误,博主是不是还有什么东西没有配置?

回复

0
没问题 我通过了
dom123456 · 1年前
woyunyun4le · 1年前
好像起不来啊

回复

rickhunter · 1年前
下载的源码与文章对不上啊

回复