springmvc的好处就是可以用一个responsebody的标签直接将一个返回的对象转换成json
首先,需要配置spring,将以下的bean配置到spring的配置文件中
1<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 2 <property name="messageConverters"> 3 <list> 4 <ref bean="mappingJacksonHttpMessageConverter" /> 5 </list> 6 </property> 7 </bean> 8 <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 9 <property name="supportedMediaTypes"> 10 <list> 11 <value>application/json;charset=UTF-8</value> 12 </list> 13 </property> 14 </bean>
其中,MappingJasonHttpMessageConvert继承了AbstractHttpMessageConverter,其他的convert还有
ByteArrayHttpMessageConverter
StringHttpMessageConverter
ResourceHttpMessageConverter
SourceHttpMessageConverter<T>
XmlAwareFormHttpMessageConverter
Jaxb2RootElementHttpMessageConverter
MappingJacksonHttpMessageConverter这个convert可以支持类对象及Hashmap的转换
我们还需要配置对应的jakson的依赖,在pom中应该如下配置
1<dependency> 2 <groupId>com.fasterxml.jackson.core</groupId> 3 <artifactId>jackson-core</artifactId> 4 <version>2.4.1</version> 5</dependency> 6<dependency> 7 <groupId>com.fasterxml.jackson.core</groupId> 8 <artifactId>jackson-databind</artifactId> 9 <version>2.4.1.1</version> 10</dependency> 11<dependency> 12 <groupId>org.codehaus.jackson</groupId> 13 <artifactId>jackson-core-asl</artifactId> 14 <version>1.9.13</version> 15</dependency> 16 17<dependency> 18 <groupId>org.codehaus.jackson</groupId> 19 <artifactId>jackson-mapper-asl</artifactId> 20 <version>1.9.13</version> 21</dependency>
接下来在java中调用
1@RequestMapping(value="getSearchResult.do") 2@ResponseBody 3public BaseJsonResult getSearchResult(HttpServletRequest request, 4 HttpServletResponse response, 5 HttpSession session, 6 SearchParaDO searchParaDO) { 7 try{ 8 String serachResultJsonString=service.getSeachResult(userMap, searchParaDO); 9 SuccessJsonResult successJsonResult=new SuccessJsonResult(serachResultJsonString); 10 return successJsonResult; 11 }catch (Exception e){ 12 logger.error(e); 13 FailureJsonResult failureJsonResult=new FailureJsonResult(e.getMessage(),e); 14 return failureJsonResult; 15 } 16}
但是就是在前台正常调用的时候,返回了406的错误,网上找了很多相同的case基本上就是配置了以上的spring及jar包就可以解决了。
The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers.
接下来继续分析,BaseJsonResult是我自己定义的一个抽象类,SuccessJsonResult和FailureJsonResult
其中定义了对应的filed,但是这些filed只是在继承类中做输出用,并没有实现对应的get方法。当然这些filed访问控制的也是default的
这样当jakson将对应的对象转换为相应的json的获取不到对应的filed就没有转换成功。
那么将对应的field暴露出去应该可以解决转换失败的问题,于是有以下两种方法解决
11.将对应的filed改成public的访问控制 2 32.暴露public的get方法
于是解决了问题,前台可以正常获取到对应对象转换的json串了。