原文地址:http://websystique.com/springmvc/spring-4-mvc-rest-service-example-using-restcontroller/

【本系列其他教程正在陆续翻译中,点击分类:spring 4 mvc 进行查看。源码下载地址在文章末尾。

【翻译 by 明明如月 QQ 605283073】

上一篇:Spring 4 MVC 视图解析器(XML JSON PDF等) 纯注解

下一篇:Spring MVC 4 RESTFul Web Services CRUD例子(带源码)【这才是restful,超经典】


本文,我们将介绍使用Spring 4 @RestController  注解实现基于RESTful JSON的 Spring 4 MVC 例子。

我们将对其进行拓展不仅支持JSON还将支持XML,只需要在POJO上简单加上JAXB注解即可。

在URL末尾加上 .json 或者 .xml获得想要的格式。

---------------------------------

使用的技术或者软件

  • Spring 4.0.6.RELEASE
  • jackson-mapper-asl 1.9.13
  • Maven 3
  • JDK 1.6
  • Tomcat 7.0.54
  • Eclipse JUNO Service Release 2

第1步: 创建项目结构

采用maven创建项目,不会的参考前面的文章
Spring 4 MVC @RestController 注解实现REST Service(带源码)_REST Service

本文将采用纯注解的方式

第2步:修改 pom.xml 添加需要的依赖


<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.websystique.springmvc</groupId>
    <artifactId>Spring4MVCHelloWorldRestServiceDemo</artifactId>
    <packaging>war</packaging>
    <version>1.0.0</version>
    <name>Spring4MVCHelloWorldRestServiceDemo Maven Webapp</name>
 
    <properties>
        <springframework.version>4.0.6.RELEASE</springframework.version>
    </properties>
 
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${springframework.version}</version>
        </dependency>
 
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
        </dependency>
 
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
    </dependencies>
 
 
    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.2</version>
                    <configuration>
                        <source>1.6</source>
                        <target>1.6</target>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>2.4</version>
                    <configuration>
                        <warSourceDirectory>src/main/webapp</warSourceDirectory>
                        <warName>Spring4MVCHelloWorldRestServiceDemo</warName>
                        <failOnMissingWebXml>false</failOnMissingWebXml>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
 
        <finalName>Spring4MVCHelloWorldRestServiceDemo</finalName>
    </build>
</project>


配置和以前一样只是加了 Jackson library (jackson-mapper-asl) 用来转换响应的数据成json 字符串。

Spring 4.1.x或者更高版本, 推荐使用jackson-databind 2.3 或者更高版本,来避免转换出现各种问题.详情参见:这里

为了安全起见,你可以添加jackson-databind库的最新版本

目前是2.5.3

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.3</version>
</dependency>


第3步: 添加一个Pojo/domain对象

package com.websystique.springmvc.domain;
 
public class Message {
 
    String name;
    String text;
 
    public Message(String name, String text) {
        this.name = name;
        this.text = text;
    }
 
    public String getName() {
        return name;
    }
 
    public String getText() {
        return text;
    }
 
}

此对象将从控制器返回并被jackson转换为JSON格式

第4步: 添加控制器

src/main/java下添加控制器
package com.websystique.springmvc.controller;
 
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import com.websystique.springmvc.domain.Message;
 
@RestController
public class HelloWorldRestController {
 
    @RequestMapping("/hello/{player}")
    public Message message(@PathVariable String player) {
 
        Message msg = new Message(player, "Hello " + player);
        return msg;
    }
 
}



@PathVariable添加这个参数将绑定  URI 模板. 需要注意的是使用了= @RestController  注解, 表明本类作为一个控制器,返回的是一个domain/pojo对象而不是视图. 这就意味着,不再使用视图解析器,响应中不再发送html数据,而是发送domain对象的特定形式。在本例中是 JSON 格式 .


第5步: 添加配置类

package com.websystique.springmvc.configuration;
 
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
 
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.websystique.springmvc")
public class HelloWorldConfiguration {
     
 
}


这里没添加视图解析器


第6步:添加初始化类

package com.websystique.springmvc.configuration;
 
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
 
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
 
public class HelloWorldInitializer implements WebApplicationInitializer {
 
    public void onStartup(ServletContext container) throws ServletException {
 
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(HelloWorldConfiguration.class);
        ctx.setServletContext(container);
 
        ServletRegistration.Dynamic servlet = container.addServlet(
                "dispatcher", new DispatcherServlet(ctx));
 
        servlet.setLoadOnStartup(1);
        servlet.addMapping("/");
    }
 
}

可以用下面的例子代替:
package com.websystique.springmvc.configuration;
 
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
 
public class HelloWorldInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
 
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { HelloWorldConfiguration.class };
    }
  
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }
  
    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
 
}


第7步: 创建和发布应用

json输出
Spring 4 MVC @RestController 注解实现REST Service(带源码)_REST Service_02
Spring 4 MVC @RestController 注解实现REST Service(带源码)_Spring 4 MVC_03


适配XML格式输出:

只需要添加JAXB注解在模型类上即可实现。

package com.websystique.springmvc.domain;
 
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
 
@XmlRootElement(name = "pizza")
public class Message {
 
    String name;
    String text;
 
    public Message(){
         
    }
     
    public Message(String name, String text) {
        this.name = name;
        this.text = text;
    }
 
    @XmlElement
    public String getName() {
        return name;
    }
     
    @XmlElement
    public String getText() {
        return text;
    }
 
}


编译重新发布


这样访问就需要带上拓展名

Spring 4 MVC @RestController 注解实现REST Service(带源码)_REST Service_04

Spring 4 MVC @RestController 注解实现REST Service(带源码)_spring_05

如果不带任何拓展名 默认是XML格式

Spring 4 MVC @RestController 注解实现REST Service(带源码)_注解_06


项目下载地址:http://websystique.com/?smd_process_download=1&download_id=765


特别说明:此系列教程有的童鞋下载下来运行 经常404 或者改成xml方式以后