如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进行通信,他们会正确处理字符串。)
答案 0 :(得分:6)
String
是Spring MVC的特殊类型。
当尝试为@RequestBody
带注释的参数生成参数时,Spring MVC会从默认或自定义HttpMessageConverter
实现列表中进行选择。其中两个与您的示例相关(按此方式排序):StringHttpMessageConverter
和MappingJackson2HttpMessageConverter
(或等效的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);