该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)
GET模式下,这里使用了@PathVariable绑定输入参数,非常适合Restful风格。因为隐藏了参数与路径的关系,可以提升网站的安全性,静态化页面,降低恶意攻击风险。
POST模式下,使用@RequestBody绑定请求对象,Spring会帮你进行协议转换,将Json、Xml协议转换成你需要的对象。@ResponseBody可以标注任何对象,由Spring完成对象——协议的转换。
spring mvc处理方法支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void。
@Controller @RequestMapping("/test") public class testcqx { private static final Logger logger = LoggerFactory.getLogger(QpayJsapiController.class); @RequestMapping(method = RequestMethod.POST)//没有子路径 @ResponseBody public String Test(){ logger.info("=========ok"); return "{success:true}"; } }
控制台打印信息和页面信息:
@Controller
@RequestMapping("/test") public class testcqx { private static final Logger logger = LoggerFactory.getLogger(QpayJsapiController.class); @RequestMapping(method = RequestMethod.POST)//没有子路径 public String Test(){ logger.info("=========ok"); return "{success:true}"; } }
控制台打印信息和页面信息:
具体原因:
@responsebody表示该方法的返回结果直接写入HTTP response body中
一般在异步获取数据时使用,Spring MVC在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@responsebody后,会直接返回json数据。
这就是为什么去掉BODY注解之后,控制器返回的时候路径会变为,(在当前路径的上一级路径后面追加路径)然后返回过程找不到对应视图,导致404错误,但对于控制器业务处理没什么影响
@Controller
@RequestMapping("/test") public class testcqx { private static final Logger logger = LoggerFactory.getLogger(QpayJsapiController.class); @RequestMapping(method = RequestMethod.POST) @ResponseBody public void Test(){ logger.info("=========ok"); } }
控制台打印信息和页面信息:
原因:@ResponseBody必须要有返回对象,(序列化一个返回对象然后注入解释)可以在配置文件中指定注解的对象,可以是json/html/xml等
在void的情况下,不能注入解释,因为根本没有实例对象要去序列化。
情况一:(@RequestMapping没有指定子路径值)
@Controller @RequestMapping("/test")类级别 public class testcqx { private static final Logger logger = LoggerFactory.getLogger(QpayJsapiController.class); @RequestMapping(method = RequestMethod.POST) public void Test(){ logger.info("=========ok"); } }
结果信息如下:
原因就是:RequestMapping默认将test当做跳转路径,而在这个时候,控制器名与视图名匹配则we didn’t set a ViewResolver
when contructing the standalone MockMvc
.
先返回上一级路径然后追加则就是paygate/test ;继续post,request;然后就形成一个环,这是不允许的!
情况二:(@RequestMapping没有指定子路径值:假如是value="/t")
那么最后的结果就是找不到路径(默认将test/t追加到上一级路径后面 ) :paygate/test/test/t