我熟悉如何@Controller使用@ResponseBody注释从我的方法返回json 。
@Controller
@ResponseBody
现在,我试图将一些json参数读入我的控制器,但到目前为止还没有运气。这是我的控制器的签名:
@RequestMapping(value = "/ajax/search/sync") public ModelAndView sync(@RequestParam("json") @RequestBody SearchRequest json) {
但是当我尝试调用此方法时,spring抱怨: Failed to convert value of type 'java.lang.String' to required type 'com.foo.SearchRequest'
Failed to convert value of type 'java.lang.String' to required type 'com.foo.SearchRequest'
删除@RequestBody注释似乎没有什么不同。
@RequestBody
手动解析json是可行的,因此Jackson必须在类路径中:
// This works @RequestMapping(value = "/ajax/search/sync") public ModelAndView sync(@RequestParam("json") String json) { SearchRequest request; try { request = objectMapper.readValue(json, SearchRequest.class); } catch (IOException e) { throw new IllegalArgumentException("Couldn't parse json into a search request", e); }
有任何想法吗?我是否在尝试做不被支持的事情?
您的参数要么是一个@RequestParam, 或者 一个@RequestBody,不能同时使用。
@RequestParam
@RequestBody用于POST和PUT请求,请求的主体就是您要解析的内容。@RequestParam用于命名参数,可以在URL上或作为多部分表单提交。
因此,您需要确定需要哪一个。您是否真的想将JSON作为请求参数?这通常不是AJAX的工作方式,通常是作为请求正文发送的。
尝试删除@RequestParam,看看是否可行。如果没有,并且您确实将JSON作为请求参数发布,那么Spring将无法在没有其他管道的情况下帮助您进行处理(请参阅定制WebDataBinder初始化)。