如何使RestController正确处理json字符串

时间:2016-06-28 18:39:15

标签: java json spring

如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);
    }
}

输入变量的值是

  

“测试”

而不是

  

测试

这将是正确的值。

请求的输出也是

  

而不是

  

“OK”

这将是正确的输出。

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

请求确实有正确的标题:

  

Content-Type:application / json;字符集= UTF-8

在RequestMapping注释中添加produce =“application / json”没有帮助。

(只是旁注:如果您使用改装或Gson进行通信,他们会正确处理字符串。)

1 个答案:

答案 0 :(得分:6)

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);