2010-07-27 12 views
12

Ho provato ad avere un controller in Spring restituisce una risposta JSON senza alcun risultato utilizzando le classi Jackson come recommended with 3.0. Ho i file jar di jackson (jackson-core-asl-1.5.5.jar & jackson-mapper-asl-1.5.5.jar) ovviamente nel mio percorso di classe.Spring Json non risolto con risposta appropriata

Per quanto riguarda le voci appconfig.xml, non sono sicuro di aver bisogno di queste. Li ho messi lì come ultimo atto di disperazione prima di tornare alla vecchia moda non-json.

In di debug, guardo il regolatore di ottenere la richiesta, restituire il foo e poi, in Firebug, ottengo un 406.

I messaggi di errore sono i seguenti: dal registratore quando è impostato per eseguire il debug: org .springframework.web.HttpMediaTypeNotAcceptableException: Impossibile trovare rappresentazione accettabile

dalla risposta: (406) la risorsa identificata da questa richiesta è solo in grado di generare risposte con caratteristiche non accettabili in base alla richiesta di "accettare" le intestazioni() .

mio appconfig.xml è qui:

<!-- Configures support for @Controllers --> 
    <mvc:annotation-driven /> 

    <!-- Resolves view names to protected .jsp resources within the /WEB-INF/views directory --> 
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="mediaTypes"> 
    <map> 
     <entry key="html" value="text/html"/> 
     <entry key="json" value="application/json"/> 
    </map> 
    </property> 
    <property name="viewResolvers"> 
    <list> 
     <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/> 
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/views/"/> 
     <property name="suffix" value=".jsp"/> 
     </bean> 
    </list> 
    </property> 
    <property name="defaultViews"> 
    <list> 
     <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" /> 
    </list> 
    </property> 
</bean> 
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basename" value="messages"></property> 
    </bean> 

mio regolatore

@RequestMapping(value="foo/bar", method=RequestMethod.GET) 
public @ResponseBody foo getFoo(@RequestParam String fooId) { 
    return new foo(fooId); 
} 

Sul jsp, in cui viene effettuata la chiamata AJAX:

function addRow() { 
$.getJSON("foo/bar",{ fooId: 1} , function(data) { 
alert("it worked.");   
}); 

}

Fammi sapere se c'è un ny più informazioni necessarie.

+0

più copertura a [Spring JSON request getting 406 (not Acceptable)] (http://stackoverflow.com/questions/7462202/spring-json-request-getting-406-non accettabile) – kdgregory

risposta

14

Sbarazzarsi di tutti i fagioli Jackson e della mappatura JSON nel resolver di negoziazione. lo mvc:annotation-driven dovrebbe configurare tutto il necessario per il funzionamento della serializzazione di Jackson.

+0

Grazie! Ho rimosso tutto ciò che riguardava Jackson e l'allarme si avvicinò. – ClutchDude

+0

Ho provato anche questo, ma non ha funzionato per me. Qualche idea? Ho Jackson sul mio classpath, e sto usando un semplice oggetto vecchio, ma sembra che non lo tagli. – stevebot

+0

@stevebot è possibile fare una nuova domanda, fornendo dettagli rilevanti. – Bozho

1

L'invio dell'intestazione Accept: application/xml non funziona. Ma mandando Accept: application/json funziona davvero, e il jackson mapper entra in gioco. Mi sono sbarazzato del mio 406 e ho ottenuto il mio oggetto java serializzato in formato json senza più config di @ResponseBody e restituisco nuovo MyObject() :) Grazie skaffman per queste informazioni e grazie a Bozho per il valore dell'intestazione di lavoro: D

+1

Cosa dire dell'uso di 'produce =" application/json "' nell'annotazione @RequestBody. – Ithar

1

Questa domanda si apre ovunque sulla rete e sono stata morsa da esso un paio di volte. Spring 3.0.6 (e 5 possibilmente) ha alcuni problemi nel rendering di JSON. Una volta cambiato in 3.1.0.RELEASE versione eveyrything ha funzionato così com'è. Senza modifiche di configurazione. È importante notare che il metodo di ritorno deve avere @ResponseBody (come nell'esempio precedente) e deve essere in servlet-context.xml o nel file di configurazione del contesto di primavera.

0

Forse la mia risposta è un po 'in ritardo, ma può aiutare qualcun altro a visitare questa domanda.

ho ottenuto il mio problema risolto con l'aggiunta di

hibernate-validator-4.0.2 

e mi ha dato un'altra eccezione (classe non trovato eccezione: org.slf4j.LoggerFactory), che ho risolto con l'aggiunta di

slf4j-api-1.5.6.jar 

spero che aiuterà qualcuno.

2

Inoltre, assicurarsi di aggiungere due file jar relativi a jackson.

  • jackson-core-asl-1.9.8.jar
  • jackson-mapper-asl-1.9.8.jar

La versione può essere diversa.

+0

Sì, questa era la cosa che mi mancava. Per usare '@ RequestBody' e' @ ResponseBody', il default sarà json format e i jacks di jackson saranno considerati per la conversione del tuo pojo. –

2

So che questo è un thread vecchio, ma forse qualcuno incontrerà lo stesso problema come me. Ho ottenuto quell'eccezione durante la migrazione di un'applicazione da Spring 4.0.3.RELEASE a Spring 4.1.0.RELEASE. Nel mio caso l'aggiornamento di Jackson da 1.9.x a 2.4.x ha fatto il trucco.

3
  1. Accertarsi che il POJO restituito abbia get(), uno per ogni campo.
  2. Assicurarsi che l'appserver (Tomcat) disponga delle librerie anche se si è sicuri del proprio sistema di compilazione (Eclipse/Maven).

Ho avuto questo errore due volte. Proprio ora ho aggiunto getter al mio pojo. L'errore 406 è andato via e ho ottenuto JSON come previsto. Suppongo che poiché i miei campi fossero protetti da pacchetti (l'accesso predefinito), li prenderei, ma non credo. Per la cronaca, nel caso abbia importanza, ho anche implementato il POJO Serializable, toString(), serialVersionUID, costruttore no-arg e costruttori espliciti.

La volta precedente che ho pulito/cancellato/aggiornato la mia cache Tomcat e ho fatto qualsiasi altra cosa per costringerlo a ricaricare. Credo che quando ho aggiunto le dipendenze di Jackson, ha corretto i miei errori di compilazione, ma dato che Tomcat li ha mancati, a runtime Spring MVC non ha scoperto le librerie di Jackson e ha prodotto l'errore 406 sul tipo di risposta inaccettabile.

1

Ho la stessa eccezione durante la migrazione dalla 3.x alla primavera 4.x.

ho risolto con l'aggiornamento dipendenze Jackson da

<dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.9.13</version> 
    </dependency> 

a

<dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-core</artifactId> 
     <version>2.5.1</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.5.1</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-annotations</artifactId> 
     <version>2.5.1</version> 
    </dependency> 

Niente altro è stato necessario per me.

+0

Ha funzionato anche per me. – renanlf