【问题标题】:Spring RequestBody convert JSON to StringSpring RequestBody 将 JSON 转换为字符串
【发布时间】:2017-11-30 07:36:45
【问题描述】:

我有一个 RestController 类,它有一个按标题搜索电影的方法:

@RequestMapping(value = "/film", method = RequestMethod.POST,
               consumes = "application/json", produces = "application/json")
public Film getFilm(@RequestBody String filmSearch){
    FilmInfo filmInfo = new FilmInfo();
    Film film = filmInfo.getFilm(filmSearch);
    return film;
}

如果我发送一个 json 字符串

{
 "filmSearch":"<title>"
} 

从 Postman 到端点,我收到一个空白回复。

然后我做了一个

System.out.println(filmSearch)

在输入方法后找到 String filmSearch 正是我从 Postman 发送的 JSON 字符串。我的应用程序没有看到 JSON 并在我的请求中从filmSearch 中提取值以附加到应用程序内字符串filmSearch。

如果我删除

consumes = "application/json" 

加入 RequestMapping 并发送它工作的标题的纯文本字符串,我得到一个以 JSON 形式发回的 Film 对象。

虽然我不想在搜索词中使用纯文本,但如何在输入方法时正确地将我的 JSON 转换为字符串?

【问题讨论】:

  • 为什么要使用 POST HTTP 方法来检索东西?
  • 我想客户端没有在其请求中指定application/json
  • 我的 Postman 请求是一个原始正文请求,其中选择了 application/json 选项,而不是 text(plain/text)。
  • 您似乎希望 Spring 将 JSON 解析为一个对象,看到它有一个 filmSearch 属性,提取它的值,并将这个值传递给您的方法。为什么会这样做?它不会。你发送 JSON,你接收 JSON。但是,它可以解析 JSON 并返回一个与您发送的 JSON 结构相匹配的对象(使用 JSON 映射器,例如 Jackson)。

标签: java spring rest deserialization


【解决方案1】:

如果您添加请求正文是 String 而不是 Object。收到的服务器是字符串 json 而不是 OBJECT。你可以试试代码:

@RequestMapping(value = "/film", method = RequestMethod.GET, produces = "application/json")
public Film getFilm(@RequestParam("search") String search){
    FilmInfo filmInfo = new FilmInfo();
    Film film = filmInfo.getFilm(search);
    return film;
}

如果您使用邮递员:

  • 网址:/flim?search=minion
  • 方法:GET
  • 标题:内容类型:应用程序/json

【讨论】:

  • 好吧,我弄错了它是如何工作的。我将改为执行此操作。谢谢
  • 为 GET 请求设置内容类型标头是没有用的:GET 请求没有内容。
【解决方案2】:

这是因为您将整个 JSON 有效负载作为字符串传递到“getfilm()”函数中。 您希望拨打的是getfilm(&lt;title&gt;),但实际上您拨打的是getfilm({"filmSearch":"&lt;title&gt;"} ),这是错误的。 最好的选择是,将该字符串转换为 JSON,这样说

JSONObject jsonstring = new JSONObject(filmSearch);
FilmInfo filmInfo = new FilmInfo();
Film film = filmInfo.getFilm(jsonstring.get("title"));

您也可以忽略请求映射中的 'consumes = "application/json"'。

【讨论】:

    猜你喜欢
    • 2017-08-23
    • 2019-06-03
    • 2018-06-28
    • 1970-01-01
    • 2014-09-04
    • 2012-10-06
    • 1970-01-01
    相关资源
    最近更新 更多