【问题标题】:How to make RestController handle json Strings properly如何让 RestController 正确处理 json 字符串
【发布时间】:2016-10-31 05:35:55
【问题描述】:

如 RFC 7159 中所提到的,字符串等原始类型本身就是有效的 json 消息。但是字符串必须用双引号括起来。

所以,字符串:

测试

在 json 中是:

“测试”

如果我发送正确引用的 POST 正文

“测试”

到下面的代码

@RestController
@RequestMapping("test")
public class TestController{
    @RequestMapping(method=RequestMethod.POST)
    public ResponseEntity<?> userLogout(@RequestBody final String input) {
        System.out.println(input);
        return new ResponseEntity<>("OK", HttpStatus.OK);
    }
}

输入变量的值为

“测试”

而不是

测试

这将是正确的值。

请求的输出也是

好的

而不是

“好的”

这将是正确的输出。

任何想法如何强制 Spring 正确处理字符串?

请求确实有正确的标头:

内容类型:应用程序/json; charset=UTF-8

在 RequestMapping 注解中添加produce="application/json" 并没有帮助。

(附带说明:如果您使用改造或 Gson 进行通信,它们确实可以正确处理字符串。)

【问题讨论】:

标签: java json spring


【解决方案1】:

String 是 Spring MVC 的特殊类型。

当尝试为 @RequestBody 注释参数生成参数时,Spring MVC 从默认或自定义 HttpMessageConverter 实现列表中进行选择。其中两个与您的示例相关(以这种方式排序):StringHttpMessageConverterMappingJackson2HttpMessageConverter(或 Gson 等效项)。

StringHttpMessageConverter 支持所有媒体类型,因此将用于从您的请求中读取原始文本,即"test",并将该值作为参数提供。

您可以按照您想要的顺序提供您自己的HttpMessageConverter 对象列表。如果您将MappingJackson2HttpMessageConverter 放在首位,那么它将能够将您的JSON 解析为String 并生成String 参数值test

如果您不想经历这些麻烦,您也可以将参数更改为对应于 JSON 字符串 TextNode 的 Jackson 类型,然后检索其值。

@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<?> userLogout(@RequestBody final TextNode input) {
    System.out.println(input.asText());
    return new ResponseEntity<>("OK", HttpStatus.OK);
}

这同样适用于响应。值"OK"String,将使用StringHttpMessageConverter 处理。使用TextNode 或重新排列您的HttpMessageConverter 列表。

return new ResponseEntity<>(new TextNode("OK"), HttpStatus.OK);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-23
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 2015-07-24
    相关资源
    最近更新 更多