【问题标题】:How to automatically parse String @RequestBody as json如何自动将字符串@RequestBody解析为json
【发布时间】:2016-03-04 06:33:25
【问题描述】:

我有一个端点,它应该将字符串值作为正文读取。

@RestController
public class EndpointsController {
   @RequestMapping( method = RequestMethod.PUT, value = "api/{myId}/name", consumes= MediaType.APPLICATION_JSON )
   public String updateName( @PathVariable( MY_ID ) String myId, @RequestBody String name) {

     //will be: "new name"
     //instead of : newname
     return myId;
   }
}

我的问题是,客户端将使用“新名称”调用它,这是正确的恕我直言,但服务器会用引号读取它,因为它不会将字符串作为 json 对象处理。我怎样才能告诉杰克逊也解析字符串(与使用 Pojos 的方式相同)?

【问题讨论】:

  • 顺便说一下,您的 @PathVariable 与您在 URL 中的内容不匹配。
  • 你怎么知道的?它是一个常数;)
  • 请添加一个json请求示例。

标签: java spring rest spring-boot jackson


【解决方案1】:

如果您使用 Jackson 作为您的 JSON 解析器,您可以简单地使用 TextNode 类型声明您的参数。这是表示 JSON 字符串的 Jackson 类型。

public String updateName(@PathVariable(MY_ID) String myId, @RequestBody TextNode name) {

然后您可以使用它的asText 方法来检索它的文本值。

【讨论】:

  • 就是这样,非常感谢!我希望在不更改 api 的情况下有一个简单的解决方案
  • 我们的 API 现在坏了。按照建议修改所有服务是没有意义的。我会搜索全局配置解决方案并通知您。
  • @baraka 请澄清您的评论与此答案的关系。什么API?怎么破?什么服务?我什么时候/在哪里建议修改所有这些?什么全局配置?我真的不明白你的评论。
  • @SotiriosDelimanolis 非常抱歉没有解释 - 我们有一个 API (RestController) 在我们进行 1.4.1 春季启动升级之前运行良好。由于现在有不少具有字符串参数的服务突然获得了带有双引号的字符串值——“”SomeString“”——所以该值是“SomeString”。这显然会给我们在代码中带来更多麻烦。我不得不承认我们现在未能解决这个问题,并且已经实施了您的解决方案。无论如何,谢谢。
  • @Andrew 很长一段时间过去了,但我们记得这只是版本升级。我们没有时间跟踪具体的变更集:(恕我直言,改变接口的行为与破坏接口契约相同。
猜你喜欢
  • 2020-02-28
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多