[英]How to make RestController handle json Strings properly
如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正確處理字符串?
請求確實有正確的標頭:
Content-Type:application / json; 字符集= UTF-8
並且在RequestMapping注釋中添加produce =“application / json”沒有幫助。
(只是旁注:如果您使用改裝或Gson進行通信,他們會正確處理字符串。)
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.