如何将字符串@RequestBody自动解析为JSON

11

我有一个端点需要读取一个字符串值作为请求体。

@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;
   }
}

我的问题是,客户端会以正确的格式“new name”调用此内容,但由于服务器无法将字符串处理为JSON对象,因此服务器会读取带引号的内容。我该如何告诉Jackson也以同样的方式解析该字符串(就像它对Pojos所做的那样)?


你的 @PathVariable 和 URL 中的不匹配,顺便提一下。 - Makoto
1
你怎么知道的?这是一个常量 ;) - riddy
1
请添加一个JSON请求示例。 - reos
1个回答

21

如果你正在使用Jackson作为你的JSON解析器,你只需使用类型TextNode声明你的参数。这是代表JSON字符串的Jackson类型。

public String updateName(@PathVariable(MY_ID) String myId, @RequestBody TextNode name) {
你可以使用它的 asText 方法来检索其文本值。

我希望有一个简单的解决方案,而不需要改变API。谢谢! - riddy
4
@baraka请澄清你的评论与这个答案有什么关系?API是什么?它怎么坏了?是哪些服务?我何时/在哪里建议修改它们?全局配置是什么?我真的不理解你的评论。 - Sotirios Delimanolis
@baraka 我在升级一个需要将Java从1.6升级到1.8和Spring 3.0.4.RELEASE升级到3.1.0.RELEASE的Spring应用程序时遇到了非常相似的情况。自那以后,任何发送到我的控制器的请求,其方法接受@RequestBody String作为参数,都以URL编码格式到达。我现在必须手动解码它们。听起来你使用了上述解决方案,但你是否弄清楚为什么会发生这种情况?只是因为版本升级吗? - Andrew Hummel
1
@Andrew,很长时间过去了,但我们记得那只是版本升级。我们没有时间跟踪具体的变更集:( 在我看来,改变接口的行为就等同于违反接口合约。 - baraka
Swagger 为 TextNode 生成的示例值难以理解: { "nodeType": "ARRAY", "array": true, "null": true, "number": true, "boolean": true, "float": true, "short": true, "object": true, "double": true, "bigDecimal": true, "textual": true, "bigInteger": true, "int": true, "binary": true, "valueNode": true, "long": true, "pojo": true, "missingNode": true, "integralNumber": true, "containerNode": true, "floatingPointNumber": true } 因此,删除字符串类型中的引号看起来要容易得多 :) - RoutesMaps.com
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接