2012-10-16 14 views
7

@ResponseBodyを使用して結果を返すREST APIのコードとMappingJacksonHttpMessageConverterをJSON形式で返すコードがあります。Spring @ResponseBodyはプリミティブ型の無効なJSONを生成します

複雑なオブジェクトの場合はすべて正常に動作します。 int,booleanおよびstringのようなプリミティブの場合は、{または[ これは有効なJSONではありません。

私はちょうどそのような単純なタイプを返す正しい方法は何ですか? { Result : true }などのオブジェクトにカプセル化する必要がありますか?

おかげ

コードサンプル:

@RequestMapping(
     value = "/login", 
     method = RequestMethod.POST) 
@ResponseBody 
public boolean Login(String username, String password) { 
    return authenticationService.authenticate(username, password); 
} 

これは無効なJSONであるだけtrueまたはfalse戻ります。オブジェクトまたは配列にカプセル化する必要があります(正しく理解していれば)。

答えて

8

trueまたはfalseを返します。そしてあなたは正しいです、それはjsonではありません。

オブジェクトではないので、jsonにすることはできません。単純にプリミティブなので、そのままです。成功ハンドラのjavascript変数に割り当てられます。あなたは完全にハッシュマップまたはカスタムラッパーオブジェクトプリミティブの使用を返さないJSONを形成していなければならない場合は

[true,false,true] 

:あなたはブール値のリストを返す場合

あなたは、配列を取得します。私は、コントローラで、その後

public class ObjWrapper<T> implements Serializable { 

    private T obj; 

    public ObjWrapper(T obj) { 
    this.obj = obj; 
    } 

    public T getObj() { 
    return obj; 
    } 

} 

を使用すると便利見つけた

{"result":true} 
+0

問題は、正しいJSONを期待するものがあるということです。たとえば、FlexでREST API呼び出しをカプセル化するFlex Builderツールは、結果がJSONになることを期待しています。 – Oxmane

+0

カスタムラッパーオブジェクトまたはハッシュマップにデータを貼り付ける – NimChimpsky

4

:HashMapを返す

public 
@ResponseBody 
Map<String, Boolean> getTrue() { 
    Map<String, Boolean> map = new HashMap<String, Boolean>(1){{put("result", Boolean.TRUE);}}; 
    return map; 
} 

は、おそらくあなたが必要とJSONを取得するための最も簡単かつ最良の方法です

@RequestMapping("/getString") @ResponseBody 
public ObjWrapper<String> getString() { ... 

およびクライアント( jqueryの)リストと同じ

$.getJson("getString", {}, function (data) { 
      alert(data.obj); 
      }) 

public class ListWrapper<T> implements Serializable { 

    private List<T> content; 

    public ListWrapper(T... objects) { 
    content = Arrays.asList(objects); 
    } 

    public ListWrapper(List<T> content) { 
    this.content = content; 
    } 

    public List<T> getContent() { 
    return content; 
    } 

} 
関連する問題