SpringMVC杂记(1)---messageConverters的Jackson配置

文章涉及代码对应的版本,spring--3.2.4.RELEASE,jackson--2.9.0.pr2,JDK---1.8

文章涉及代码路径--- https://github.com/wangjiuong/springstudy/tree/master/SpringMvcArgResolver

工程为pom工程,

工程如下图:

 

 

在使用spring实现某些后台服务的时候,返回值往往不是string类型,而是某个bean对象,在json流行的时代,如果能够将bean转换为json对象,那么就方便调用端进行解析,

而且对于我们提供给外部的API,也可以要求参数是bean对象,本文章主要的讲解下在spring中如何通过配置实现这个。

在spring中提供了参数转化类 RequestMappingHandlerAdapter。代码路径:package org.springframework.web.servlet.mvc.method.annotation;

RequestMappingHandlerAdapter中有个属性messageConverters。messageConverters主要提供的类型转换功能,

 

在3.2.5中默认只添加了如下几种

 1 public RequestMappingHandlerAdapter() {
 2 
 3 StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
 4 stringHttpMessageConverter.setWriteAcceptCharset(false); // See SPR-7316
 5 
 6 this.messageConverters = new ArrayList<HttpMessageConverter<?>>();
 7 this.messageConverters.add(new ByteArrayHttpMessageConverter());
 8 this.messageConverters.add(stringHttpMessageConverter);
 9 this.messageConverters.add(new SourceHttpMessageConverter<Source>());
10 this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
11 }

所以我们需要手工添加 MappingJackson2HttpMessageConverter

 

代码中用到的Bean对象如下:

 1 @Component
 2 public class Student {
 3     private String name;
 4     private int year;
 5     public String getName() {
 6         return name;
 7     }
 8     public void setName(String name) {
 9         this.name = name;
10     }
11     public int getYear() {
12         return year;
13     }
14     public void setYear(int year) {
15         this.year = year;
16     }
17 }

control 设计如下:

 1 @Controller
 2 @RequestMapping("/controlhandler")
 3 public class ControlHandler {
 4     
 5     @RequestMapping(value="/helloworld", method = RequestMethod.GET,produces="application/json")
 6     @ResponseBody
 7     public Student helloWorld(){
 8         Student student=(Student)ApplicationContextAwareUtil.getBean("student");
 9         return student;
10     }
11     
12     @RequestMapping(value="/helloworld", method = RequestMethod.POST,produces="application/json")
13     @ResponseBody
14     public Student helloWorld(@RequestBody Student student){
15         student.setName(student.getName()+(new Date()));
16         return student;
17     }
18 
19 }

@ResponseBody表示该handle的返回值无须经过view渲染,直接返回给调用者。

 

ApplicationContextAwareUtil类实现了ApplicationContextAware,方便在@Controller中直接获取容器中的Bean对象。

ApplicationContextAwareUtil必须在spring配置文件中以Bean的形式配置。

 1 public class ApplicationContextAwareUtil implements ApplicationContextAware{
 2     private static ApplicationContext applicationContext;
 3 
 4     @Override
 5     public void setApplicationContext(ApplicationContext arg0) throws BeansException {
 6         ApplicationContextAwareUtil.applicationContext= arg0;
 7         
 8     }
 9 
10     public static Object getBean(String paramString)
11       {
12         return applicationContext.getBean(paramString);
13       }
14 }

 

spring的配置文件,分为两个,一个是实现基本的Bean对象组装,另外一个实现RequestMappingHandler的配置。

 

spring-common.xml配置如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans
 5     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 6     http://www.springframework.org/schema/context
 7     http://www.springframework.org/schema/context/spring-context-3.0.xsd
 8     http://www.springframework.org/schema/mvc
 9     http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
10 
11     <context:component-scan base-package="com.nuaa.control" />
12     <bean id="student" class="com.nuaa.bean.Student">
13         <property name="name" value="wangjiuyong" ></property>
14         <property name="year" value="1"></property>
15     </bean>
16     
17     <bean id="ApplicationContextAwareUtil" class="com.nuaa.util.ApplicationContextAwareUtil">    
18     </bean>
19 </beans>

 

spring-requestmapinghandler.xml的配置如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans
 5     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 6     http://www.springframework.org/schema/context
 7     http://www.springframework.org/schema/context/spring-context-3.0.xsd
 8     http://www.springframework.org/schema/mvc
 9     http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
10     <bean
11         class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
12     <bean
13         class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
14         <property name="messageConverters">
15             <list>
16                 <bean
17                     class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
18                     <property name="supportedMediaTypes">
19                         <list>
20                             <value>text/html;charset=UTF-8</value>
21                             <value>application/json;charset=UTF-8</value>
22                         </list>
23                     </property>
24                 </bean>
25             </list>
26         </property>
27     </bean>
28 </beans>

注意,RequestMappingHandlerMapping也必须配置进行,否则会提示找不到MappingHandler的错误。

 

web.xml的配置如下:

 1 <!DOCTYPE web-app PUBLIC
 2  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 3  "http://java.sun.com/dtd/web-app_2_3.dtd" >
 4 
 5 <web-app>
 6     <display-name>Archetype Created Web Application</display-name>
 7 
 8     <servlet>
 9         <servlet-name>DispatcherServlet</servlet-name>
10         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
11         <init-param>
12             <param-name>contextConfigLocation</param-name>
13             <param-value>classpath:spring-*.xml</param-value>
14         </init-param>
15         <load-on-startup>1</load-on-startup>
16     </servlet>
17     <servlet-mapping>
18         <servlet-name>DispatcherServlet</servlet-name>
19         <url-pattern>/</url-pattern>
20     </servlet-mapping>
21 </web-app>

 

pom文件中必须要引入jkson的jar,

pom.xml的配置如下:

 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 2     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 3     <modelVersion>4.0.0</modelVersion>
 4     <groupId>com.nuaa</groupId>
 5     <artifactId>RequestMappingHandler</artifactId>
 6     <packaging>war</packaging>
 7     <version>0.0.1-SNAPSHOT</version>
 8     <name>RequestMappingHandler Maven Webapp</name>
 9     <url>http://maven.apache.org</url>
10 
11     <properties>
12         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
13         <spring.version>3.2.4.RELEASE</spring.version>
14         <jackson.version>2.9.0.pr2</jackson.version>
15 
16     </properties>
17 
18 
19     <dependencies>
20         <dependency>
21             <groupId>junit</groupId>
22             <artifactId>junit</artifactId>
23             <version>3.8.1</version>
24             <scope>test</scope>
25         </dependency>
26 
27         <!-- spring需要的jar包 -->
28         <dependency>
29             <groupId>org.springframework</groupId>
30             <artifactId>spring-context</artifactId>
31             <version>${spring.version}</version>
32             <type>jar</type>
33         </dependency>
34 
35         <dependency>
36             <groupId>org.springframework</groupId>
37             <artifactId>spring-core</artifactId>
38             <version>${spring.version}</version>
39             <type>jar</type>
40         </dependency>
41 
42         <dependency>
43             <groupId>org.springframework</groupId>
44             <artifactId>spring-beans</artifactId>
45             <version>${spring.version}</version>
46             <type>jar</type>
47         </dependency>
48 
49         <dependency>
50             <groupId>org.springframework</groupId>
51             <artifactId>spring-webmvc</artifactId>
52             <version>${spring.version}</version>
53             <type>jar</type>
54         </dependency>
55 
56         <dependency>
57             <groupId>org.springframework</groupId>
58             <artifactId>spring-orm</artifactId>
59             <version>${spring.version}</version>
60 
61 
62             <type>jar</type>
63         </dependency>
64         <!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
65         <dependency>
66             <groupId>javax.servlet</groupId>
67             <artifactId>servlet-api</artifactId>
68             <version>2.5</version>
69         </dependency>
70         <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
71         <dependency>
72             <groupId>com.fasterxml.jackson.core</groupId>
73             <artifactId>jackson-core</artifactId>
74             <version>${jackson.version}</version>
75         </dependency>
76         <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
77         <dependency>
78             <groupId>com.fasterxml.jackson.core</groupId>
79             <artifactId>jackson-databind</artifactId>
80             <version>${jackson.version}</version>
81         </dependency>
82         <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
83         <dependency>
84             <groupId>com.fasterxml.jackson.core</groupId>
85             <artifactId>jackson-annotations</artifactId>
86             <version>${jackson.version}</version>
87         </dependency>
88     </dependencies>
89     <build>
90         <finalName>RequestMappingHandler</finalName>
91     </build>
92 </project>

将工程打包为war包,放在tomcat下面,就可以进行调用测试了。

先测试GET请求:

 

 
对象已经被转换成json对象返回。
 
在测试下POST请求

 

 
返回结果为

 

 
body体参数首先将json转换成了bean对象,处理后,再以bean对象返回,spring就将对象再转换成json返回。
 如果传入的body体,不满足转换要求,那么就会提示错误

多增加了一个字段。返回结果如下:

 

posted @ 2017-04-08 23:39  王久勇  阅读(2503)  评论(0)    收藏  举报