在这篇文章中,我们将通过开发使用 Spring4 @RestController 注解来开发基于Spring MVC4的REST风格的JSON服务。我们将扩展这个例子通过简单的注释与JAXB标注域类支持XML输出和JSON输出。在这个示例中,我们需要URL的后缀为 .xml 或 .json 以获得所需的输出。

使用以下技术:
  • 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步:创建目录结构
之前的文章使用Eclipse创建Maven Web项目包含了一步一步的指导,使用 Eclipse 来创建一个Maven项目(Spring4MVCRestServiceDemo)。
下面是最终的项目目录结构:

我们将使用 Spring Java配置而不使用XML。现在,让我们来添加/更新上述项目结构中提到的内容。
第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.yiibai.springmvc</groupId>
<artifactId>Spring4MVCRestServiceDemo</artifactId>
<packaging>war</packaging>
<version>1.0.0</version>
<name>Spring4MVCRestServiceDemo 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-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<warSourceDirectory>src/main/webapp</warSourceDirectory>
<warName>Spring4MVCRestServiceDemo</warName>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<finalName>Spring4MVCRestServiceDemo</finalName>
</build>
</project> 

上面的 pom.xml 与以前的教程中定义的相同。有一个显着的区别: 我们已经包括一个依赖于Jackson 库(jackson-mapper-asl),其将用于所述响应数据转换成JSON字符串。

对于Spring 4.1.x 和以上, jackson-databind 2.3或以上是推荐使用的,以避免转换问题。

安全的选择,你可以包括 jackson-databind 最新版本。
    <dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.3</version>
</dependency>
第3步:添加一个POJO/域对象
package com.yiibai.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.yiibai.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.yiibai.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 注解,这标志着这个类作为控制器,每一个方法返回域对象/pojo代替一个视图。这意味着我们不再使用视图解析器,我们不再直接发送响应的HTML,我们只发送的域对象转换成格式。在我们的例子中,由于 jackson 包含在类路径中,消息对象将转换成JSON格式。

第5步:添加配置类
package com.yiibai.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.yiibai.springmvc")
public class HelloWorldConfiguration { } 

在这里,这个类是主要提供组件,扫描和注释支持。需要注意的是,我们没有任何视图解析器配置,因为我们在Rest案例并不需要。

第6步:添加初始化类

添加一个初始化类实现WebApplicationInitializer在src/main/java,使用如下图所示指定包(在这种情况下,替代在web.xml中定义的任何spring的配置)。在Servlet 3.0容器启动时,这个类会被加载并实例,它是在启动时方法将通过servlet容器调用。

package com.yiibai.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("/");
} } 

更新:请注意,上面的类可以写成更加简洁[和它的首选方式],通过扩展 AbstractAnnotationConfigDispatcherServletInitializer 基类,如下所示:

package com.yiibai.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步:构建和部署应用程序

现在构建 war(在 Eclipse中)或通过 Maven 命令行( mvn clean install)。 部署 war 文件到Servlet3.0容器。

运行它。访问: http://localhost:8080/Spring4MVCRestServiceDemo/hello/Messi ,您将看到 JSON 输出,如下图所示:

就这样,所有输出如上所示。

适应XML输出

现在,如上面提到的,只是通过增加模型类(Message)JAXB注释,我们可以让XML输出支持以及JSON输出。下面是相同的演示:

package com.yiibai.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;
} }
编译,部署并再次运行它,会看到下面的输出(注意URL后缀),访问URL:http://localhost:8080/Spring4MVCRestServiceDemo/hello/Yiibai.xml

再次访问:http://localhost:8080/Spring4MVCRestServiceDemo/hello/Yiibai.json

如果没有任何后缀,默认格式是XML:

到这里,全部完成!

Spring4 MVC REST服务使用@RestController实例的更多相关文章

  1. REST服务使用@RestController实例,输出xml/json

    REST服务使用@RestController实例,输出xml/json 需要用到的服务注解 org.springframework.web.bind.annotation.RestControlle ...

  2. Spring4 MVC HelloWorld 注解和JavaConfig实例

    在这一节中,我们以 Spring4 MVC HelloWorld 注释/JavaConfig为示例,一步一步以简单的方式学习Spring4 MVC 的注解,项目设置,代码,部署和运行. 在先前的 Sp ...

  3. Spring4 MVC+ AngularJS CRUD使用$http实例

    这篇文章显示了使用Spring MVC4整合AngularJS.我们将创建一个使用后端和AngularJS作为前端的纯JSP封装Spring REST API一个CRUD应用程序, 使用 $http ...

  4. Spring4 MVC ContentNegotiatingViewResolver多种输出格式实例

    本文演示支持多种输出格式,这里 Spring4 MVC应用程序使用了 Spring ContentNegotiatingViewResolver .我们将生成应用程序输出XML,JSON,PDF,XL ...

  5. Spring4 MVC ContentNegotiatingViewResolver多种输出格式实

    前段时间在一个项目里面发现,针对Excel的处理没有一个公用的视图,来个下载的需求就要自己去写一堆POI的东西,终于有一天给我也来了几个,还是按照以前的方式来写,写多了真心想吐,后面想想还是有必要整个 ...

  6. ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 03. 服务注册和管道

    ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 03. 服务注册和管道 语雀: https://www.yuque.com/yuejiangliu/dotnet/ ...

  7. Spring4 MVC Hibernate4集成 Annotation

    Spring4 MVC Hibernate4集成 Annotation 一.本文所用环境 二.工程目录 三.Maven添加依赖 四.新建数据库表 五.配置文件 六.Model层 七.DAO层 八.Se ...

  8. Spring4 MVC Hibernate4集成

      Spring4 MVC Hibernate4集成 一.    本文所用环境 Spring4.0.3.RELEASE Hibernate4.3.5.Final Mysql 二.    工程目录 三. ...

  9. Azure 云服务中的实例端点

    Azure云服务(cloud Servive)中有三种端点类型(endpoint type):输入端点(input);内部端点(internal);实例端点(InstanceInput) 1.输入端点 ...

随机推荐

  1. javascript快速入门7--ECMAScript语法基础

    ECMAScript的基础概念 熟悉Java.C和Perl这些语言的开发者会发现ECMAScript的语法很容易掌握,因为它借用了这些语言的语法.Java和ECMAScript有一些关键语法特性相同, ...

  2. 【angularJS】前后台分离,angularJS使用Token认证

    参考资料: [AngularJS系列(4)] 那伤不起的provider们啊~ (Provider, Value, Constant, Service, Factory, Decorator):htt ...

  3. 【Linux】pv vg lv, 加盘,扩容磁盘

    PV VG LV关系:一个物理盘(或一个lun)就是一个pv,有几个物理盘就有几个pv.一个或者几个硬盘可以组成一个vg,一个系统可以包括好几个vg,比如rootvg ,datavg等 PV组成VG, ...

  4. Bat 获取本地代码的Svn Revision并保存到变量

    echo off & color 0A for /f "usebackq delims=" %%i in (`"svn info Server | findstr ...

  5. ViewPager中Fragment无法显示的问题

    问题描述: Actvitiy->Fragment1 ->Fragment2 Fragment1中有1个ViewPager,ViewPager里面有包括了2个Fragment. 当第一次执行 ...

  6. iOS 程序进入后台,包含用户上拉快捷菜单导致程序失去活跃的研究

    今日在使用某App时候,突然发现上拉菜单.程序视频扔在播放,咦!引起了我的兴趣. 首先,列出两个方法, 第一个方法是AppDelegate的代理.当程序进入后台时候调用 - (void)applica ...

  7. Loadrunner Analysis之Web Page Diagnostics

    Loadrunner Analysis之Web Page Diagnostics 分类: LoadRunner 性能测试 2012-12-31 18:47 1932人阅读 评论(2) 收藏 举报 di ...

  8. iDempiere的用户密码加密处理(AD_User.Password)(Postgresql 9.1)

    怀揣着为中小企业量身定做一整套开源软件解决方案的梦想开始了一个网站的搭建.http://osssme.org/ 首先对Postgresql数据库进行加密处理. 参考网页:francs写的:Postgr ...

  9. CentOS6.5配置PHP CI程序

    步骤: 1.安装CentOS6.5系统:     1.选择PHP+Mysql环境 2.关闭防火墙和SeLinux     1.chkconfig --level 35 iptables off     ...

  10. Webpack 的 HtmlWebpackPlugin 如何控制某个 chunks 的 inject 位置?

    https://segmentfault.com/q/1010000006591131 通过修改 HtmlWebpackPlugin 源码实现了 修改后的配置: new HtmlWebpackPlug ...