很久没搭建过Spring MVC的开发架子,今早在@ResponseBody返回JSON处卡了会儿。翻阅doc,发现了以前不知道的注解,@RestController,了解了下,是个好东西。
@RestController注解是Spring4为了简化RESTFUL风格的开发而出现的,它继承了传统的@Controller。
使用@RestController,无需给每个@RequestMapping添加@ResponseBody注解。
下面是@RestController的定义:
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController
在 spring-mvc.xml 中,指定messageConverter:
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter" />
</mvc:message-converters>
</mvc:annotation-driven>
此处,我使用阿里的fastjson代替了Spring内置的Jackson,光是看命名就知道为啥这么做了:)
需要注意的地方
- @RestController虽然继承了@Controller,但是却不能返回jsp,即试图解析器InternalResourceViewResolver会失效
@RequestMapping(value = "/test")
public ModelAndView testJsp() {
return new ModelAndView("getPage");
}
若使用@Controller注解上面方法所在的类,将返回getPage.jsp页面
而使用@RestController注解,则会返回"getPage"的字符串
- 在Spring-mvc.xml中,尽量使用 <mvc:annotation-driven> 自动装配。若要手动注册,应使用下面的两个bean
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
若使用老版本的
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
将会得到异常信息
would dispatch back to the current handler URL [/getPage] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)
小结
使用@RestController,就不用给每个@RequestMapping添加@ResponseBody,也省去了配置 content-type 或 media-type,很是方便。
在开发中,若是RESTFUL风格的接口,大可采用这种方式。
网友评论