一尘不染

在Spring-MVC中将JSON解析为Java对象

spring-mvc

我熟悉如何@Controller使用@ResponseBody注释从我的方法返回json 。

现在,我试图将一些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'

删除@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);
    }

有任何想法吗?我是否在尝试做不被支持的事情?


阅读 335

收藏
2020-06-01

共1个答案

一尘不染

您的参数要么是一个@RequestParam或者 一个@RequestBody,不能同时使用。

@RequestBody用于POST和PUT请求,请求的主体就是您要解析的内容。@RequestParam用于命名参数,可以在URL上或作为多部分表单提交。

因此,您需要确定需要哪一个。您是否真的想将JSON作为请求参数?这通常不是AJAX的工作方式,通常是作为请求正文发送的。

尝试删除@RequestParam,看看是否可行。如果没有,并且您确实将JSON作为请求参数发布,那么Spring将在没有其他管道的情况下无法帮助您进行处理(请参阅自定义WebDataBinder初始化)。

2020-06-01