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

2021-08-27 15:26:14 浏览数 (1)

原文地址: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创建项目,不会的参考前面的文章

本文将采用纯注解的方式

第2步:修改 pom.xml 添加需要的依赖
代码语言:javascript复制
    4.0.0
    com.websystique.springmvc
    Spring4MVCHelloWorldRestServiceDemo
    war
    1.0.0
    Spring4MVCHelloWorldRestServiceDemo Maven Webapp
 
    
        4.0.6.RELEASE
    
 
    
        
            org.springframework
            spring-core
            ${springframework.version}
        
        
            org.springframework
            spring-web
            ${springframework.version}
        
        
            org.springframework
            spring-webmvc
            ${springframework.version}
        
 
        
            javax.servlet
            javax.servlet-api
            3.1.0
        
        
            javax.servlet.jsp.jstl
            jstl-api
            1.2
        
        
            javax.servlet.jsp
            javax.servlet.jsp-api
            2.3.1
        
 
        
            org.codehaus.jackson
            jackson-mapper-asl
            1.9.13
        
    
 
 
    
        
            
                
                    org.apache.maven.plugins
                    maven-compiler-plugin
                    3.2
                    
                        1.6
                        1.6
                    
                
                
                    org.apache.maven.plugins
                    maven-war-plugin
                    2.4
                    
                        src/main/webapp
                        Spring4MVCHelloWorldRestServiceDemo
                        false
                    
                
            
        
 
        Spring4MVCHelloWorldRestServiceDemo

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

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

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

目前是2.5.3

代码语言:javascript复制
    com.fasterxml.jackson.core
    jackson-databind
    2.5.3
第3步: 添加一个Pojo/domain对象
代码语言:javascript复制
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下添加控制器

代码语言:javascript复制
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步: 添加配置类
代码语言:javascript复制
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步:添加初始化类
代码语言:javascript复制
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("/");
    }
 
}

可以用下面的例子代替:

代码语言:javascript复制
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输出

适配XML格式输出:

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

代码语言:javascript复制
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;
    }
 
}

编译重新发布

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

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

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

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

缺少org.springframework.web.context.ContextLoaderServlet等

参见:http://blog.csdn.net/w605283073/article/details/52126347

0 人点赞