很久沒(méi)搭建過(guò)Spring MVC的開(kāi)發(fā)架子蒋譬,今早在@ResponseBody返回JSON處卡了會(huì)兒。翻閱doc女器,發(fā)現(xiàn)了以前不知道的注解,@RestController住诸,了解了下驾胆,是個(gè)好東西涣澡。
@RestController注解是Spring4為了簡(jiǎn)化RESTFUL風(fēng)格的開(kāi)發(fā)而出現(xiàn)的,它繼承了傳統(tǒng)的@Controller丧诺。
使用@RestController入桂,無(wú)需給每個(gè)@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內(nèi)置的Jackson,光是看命名就知道為啥這么做了:)
需要注意的地方
- @RestController雖然繼承了@Controller呵晚,但是卻不能返回jsp蜘腌,即試圖解析器InternalResourceViewResolver會(huì)失效
@RequestMapping(value = "/test")
public ModelAndView testJsp() {
return new ModelAndView("getPage");
}
若使用@Controller注解上面方法所在的類,將返回getPage.jsp頁(yè)面
而使用@RestController注解饵隙,則會(huì)返回"getPage"的字符串
- 在Spring-mvc.xml中撮珠,盡量使用 <mvc:annotation-driven> 自動(dòng)裝配。若要手動(dòng)注冊(cè)癞季,應(yīng)使用下面的兩個(gè)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">
將會(huì)得到異常信息
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.)
小結(jié)
使用@RestController劫瞳,就不用給每個(gè)@RequestMapping添加@ResponseBody,也省去了配置 content-type 或 media-type绷柒,很是方便志于。
在開(kāi)發(fā)中,若是RESTFUL風(fēng)格的接口废睦,大可采用這種方式伺绽。