springmvc的好处就是可以用一个responsebody的标签直接将一个返回的对象转换成json
首先,需要配置spring,将以下的bean配置到spring的配置文件中
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter" />
</list>
</property>
</bean>
<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
其中,MappingJasonHttpMessageConvert继承了AbstractHttpMessageConverter,其他的convert还有
ByteArrayHttpMessageConverter
StringHttpMessageConverter
ResourceHttpMessageConverter
SourceHttpMessageConverter
XmlAwareFormHttpMessageConverter
Jaxb2RootElementHttpMessageConverter
MappingJacksonHttpMessageConverter这个convert可以支持类对象及Hashmap的转换
我们还需要配置对应的jakson的依赖,在pom中应该如下配置
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.1.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
接下来在java中调用
@RequestMapping(value="getSearchResult.do")
@ResponseBody
public BaseJsonResult getSearchResult(HttpServletRequest request,
HttpServletResponse response,
HttpSession session,
SearchParaDO searchParaDO) {
try{
String serachResultJsonString=service.getSeachResult(userMap, searchParaDO);
SuccessJsonResult successJsonResult=new SuccessJsonResult(serachResultJsonString);
return successJsonResult;
}catch (Exception e){
logger.error(e);
FailureJsonResult failureJsonResult=new FailureJsonResult(e.getMessage(),e);
return failureJsonResult;
}
}
但是就是在前台正常调用的时候,返回了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暴露出去应该可以解决转换失败的问题,于是有以下两种方法解决
1.将对应的filed改成public的访问控制
2.暴露public的get方法
于是解决了问题,前台可以正常获取到对应对象转换的json串了。