2016-06-28 10 views
2

たとえば、RFC 7159のように、文字列などのプリミティブ型は、有効な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); 
    } 
} 

に "テスト"

入力変数の値が

"テスト"

代わりに

012であります正しい値であろう

試験

また要求の出力は

OK

代わりに

正しい出力あろう

"OK"

あります。

文字列を適切に処理するためにSpringを強制する方法はありますか?

要求が正しいヘッダ持っている:

コンテンツタイプ:アプリケーション/ JSONを。 charset = UTF-8

RequestMappingアノテーションにproduce = "application/json"を追加しても役に立ちませんでした。

(ただ、サイドノート:あなたは通信のために改造またはGsonを使用している場合は、それらが適切に文字列を処理します)

+1

【春休止コントローラでJSONの戻り値として、単純な文字列(の可能性のある重複http://stackoverflow.com/questions/23581619/simple-string-as-json-return-value-in-spring- rest-controller) –

+0

これは役に立ちますか? http://stackoverflow.com/questions/18385361/return-json-for-responseentitystringまた、消費メディアの種類を調整してみてください – Bernhard

+0

@Bernhard no、それは役に立たず、その質問には解決策はありません – Groosa

答えて

4

Stringは、Spring MVCのための特殊なタイプです。

@RequestBody注釈付きパラメータの引数を生成しようとすると、Spring MVCはデフォルトまたはカスタムHttpMessageConverterの実装のリストから選択します。これらのうちの2つは、あなたの例(このように注文したもの)に関係します:StringHttpMessageConverterMappingJackson2HttpMessageConverter(またはそれに相当するもの)。

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

関連する問題