2016-06-28 92 views
2

正如在RFC 7159中舉例說明的那樣,字符串etc基本類型是它們自己的有效json消息。但是字符串必須用雙引號括起來。如何使RestController處理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」

這將是正確的輸出。

任何想法如何強制春季正確處理字符串?

該請求確實正確的報頭:

內容類型:應用/ JSON; charset = UTF-8

而向RequestMapping註釋添加produce =「application/json」並沒有幫助。

(只是一個側面說明:如果您使用改造或GSON溝通,他們做妥善處理字符串。)

+1

[在彈簧其餘控制器簡單字符串作爲JSON返回值](的可能的複製http://stackoverflow.com/questions/23581619/simple-string-as-json-return-value-in-spring-其餘控制器) –

+0

這有幫助嗎? http://stackoverflow.com/questions/18385361/return-json-for-responseentitystring另外嘗試調整消費媒體類型 – Bernhard

+0

@Bernhard不,這並沒有幫助,在那個問題上沒有解決方案 – Groosa

回答

4

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

非常感謝您的答覆! TextNode解決方案運行良好。 – Groosa