spring 3可以支持Rest风格参数,其内置了jackson框架作为REST的json参数转换成javabean对象,以及bean对象转换成json参数。
下文以spring 3.1.1 + fastjson为例(低于这个版本的不知道能不能行),说明如何使用springmvc构造resuful参数及输出。
不说废话了,直接上代码:Controller类:
@Controller
public class TestCon
{
@ResponseBody
@RequestMapping("/test")
public Object test(@RequestBody
final TBean tBean)
{
System.out.println(tBean);
final List<Object> lists = new ArrayList<Object>();
lists.add("3434");
lists.add(tBean);
lists.add(new String[] { "a", "b" });
return lists;
}
}
其中:@RequestBody可以使请求中的REST风格的json字符串直接转换成我们想要的参数TBean(当然,低层是使用fastjson等框架转换).
此方法的返回值为一个List对象,经过转换成json输出后,是一个js数组格式的内容。
@RequestBody不可少,表示将方法的返回值作为响应内容。
?
数据bean对象。
public class TBean
{
private String id;
//....
}
?
好了,最关键的一步:在springmvc 的配置文件中(XXX-servlet.xml)配置json格式转换方式:
<!-- 方式一 -->
<!--
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter" />
</mvc:message-converters>
</mvc:annotation-driven>
-->
<!-- 方式二 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"></bean>
</list>
</property>
</bean>
需要注意的是:方式一和方式二,选择一种实现即可。其它方式一是使用了命名空间的引入,需要引入mvc的命名空间,sprng3.0 不支持这种写法。这两种写法不能同时存在,如果同时存在,功能将异常。
核心代码就是这样的。当然不可缺少的要把fastjson框架的jar包引入到工程中。
?
模拟发起请求:

其中:{id:'34'}为REST风格的字符串,将被fastjson转换成TBean对象,直接扔给控制器的方法调用。
Content-Type: application/json; charset=utf-8
Accept: application/json
为请求头信息,以上的代码只支持Context-Type为application/json格式的头,如果没有此头或头内容不是application/json,spring将抛出415的http返回码,导致失败:

如果配置了log4j打印spring debug级别的日志,
可以看到日志中出现如下信息:
************************************************************未设置Content-Type信息的错误日志********************************************************************************
DEBUG DefaultAnnotationHandlerMapping - Mapping [/test.do] to HandlerExecutionChain with handler [test.controllers.TestCon@c81672] and 1 interceptor
DEBUG AnnotationMethodHandlerExceptionResolver - Resolving exception from handler [test.controllers.TestCon@c81672]: org.springframework.web.HttpMediaTypeNotSupportedException: Cannot extract parameter (TBean tBean): no Content-Type found
DEBUG ResponseStatusExceptionResolver - Resolving exception from handler [test.controllers.TestCon@c81672]: org.springframework.web.HttpMediaTypeNotSupportedException: Cannot extract parameter (TBean tBean): no Content-Type found
DEBUG DefaultHandlerExceptionResolver - Resolving exception from handler [test.controllers.TestCon@c81672]: org.springframework.web.HttpMediaTypeNotSupportedException: Cannot extract parameter (TBean tBean): no Content-Type found
DEBUG DispatcherServlet - Null ModelAndView returned to DispatcherServlet with name 'dispatcher': assuming HandlerAdapter completed request handling
************************************************************设置为非application/json的错误日志*********************************************************************************
DEBUG DefaultAnnotationHandlerMapping - Mapping [/test.do] to HandlerExecutionChain with handler [test.controllers.TestCon@c81672] and 1 interceptor
DEBUG Annotati
