2014-12-24 2 views
5

L'applicazione JSON Spring Spring di Spring JSON restituisce un oggetto JSONObject. Accedendo all'URL, ricevo la pagina di errore 406. Funziona quando restituisco String o ArrayList.Il ritorno di JSONObject dal controller a molla genera l'errore 406

Primavera Controller:

package com.mkyong.common.controller; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.ResponseBody; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import org.json.JSONException; 
import org.json.JSONObject; 

@Controller 
public class JSONController { 

    @RequestMapping("/test") 
    @ResponseBody 
    public JSONObject test() { 
     try { 
      JSONObject result = new JSONObject(); 
      result.put("name", "Dade") 
        .put("age", 23) 
        .put("married", false); 
      return result; 
     } catch (JSONException ex) { 
      Logger.getLogger(JSONController.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     return null; 
    } 

} 

come posso risolvere questo problema? Grazie per l'aiuto. Sono nuovo di Spring MVC, non ho trovato la soluzione a questo problema nelle risposte SO esistenti.

+0

Penso che è necessario per indicare il tipo di contenuto di risposta per il valore di ritorno della funzione provare questo: @RequestMapping (value = "/ test", method = RequestMethod.GET, produce = "application/json ") Fammi sapere se questo funziona per scrivere una risposta migliore –

+0

@JorgeGarita Non funziona. Stessa risposta. –

+3

Spring MVC supporta la serializzazione JSON tramite Jackson, non JSONObject –

risposta

0

Si sta tentando di eseguire manualmente qualcosa che Spring MVC è già automaticamente per te. Spring deduce automaticamente una rappresentazione del tipo restituito e fa una conversione. Come funziona, puoi imparare da http://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc. Nel tuo caso la sua conversione in JSON.

Funziona quando torno String o ArrayList

Cosa accade sotto il cofano è che Spring MVC sta usando Jackson biblioteca, per convertire il tipo di ritorno a JSON. E poiché non ha alcun problema a convertire il tipo String o List, tutto funziona correttamente.

Quello che succede nel codice che hai postato è che, il mappatore di oggetti di Jackson sta provando a convertire l'istanza JSONObject in JSON, e questo fallisce, perché jackson si aspetta un oggetto POJO che l'istanza di JSONObject non è.

Per farlo funzionare, è sufficiente scrivere il POJO e restituirlo. Quindi, qualcosa di simile a

public class Person { 

    private String name; 
    private Integer age; 
    private Boolean married; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Integer getAge() { 
     return age; 
    } 

    public void setAge(Integer age) { 
     this.age = age; 
    } 

    public Boolean getMarried() { 
     return married; 
    } 

    public void setMarried(Boolean married) { 
     this.married = married; 
    } 
} 

e avere il vostro metodo di cambiato in

@RequestMapping("/test") 
    @ResponseBody 
    public Person test() { 
     Person person = new Person(); 
     person.setName("Dade"); 
     person.setAge(23); 
     person.setMarried(false); 
     return person; 
    } 

Per quanto riguarda l'errore, la stessa eccezione si vedrà nel esempio di lavoro se per esempio eliminare getter e setter, o il nome erroneamente, si verifica un'eccezione durante il tentativo di conversione in una rappresentazione e si ottiene un errore 406

+1

Se si segue la stessa logica, anche una mappa non è un POJO. Come si piazza questo? –

0

Penso che sia necessario impostare le intestazioni in @RequestMapping e restituire HashMap.

@RequestMapping(value = "json", method = RequestMethod.GET, headers = "Accept=application/json") 
public @ResponseBody 
Map<String, String> helloJson() { 
    HashMap<String, String> map = new HashMap<String, String>(); 
    map.put("k1", "v1"); 
    map.put("k2", "v2"); 
    map.put("k3", "v3"); 
    return map; 
}