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请求:

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


浙公网安备 33010602011771号