questo è il mio javascript:
function getWeather() { $.getJSON('getTemperature/' + $('.data option:selected').val(), null, function(data) { alert('Success'); }); }
questo è il mio controller:
@RequestMapping(value="/getTemperature/{id}", headers="Accept=*/*", method = RequestMethod.GET) @ResponseBody public Weather getTemparature(@PathVariable("id") Integer id){ Weather weather = weatherService.getCurrentWeather(id); return weather; }
spring-servlet.xml
Ottenere questo errore:
GET http://localhost:8080/web/getTemperature/2 406 (Not Acceptable)
Foraggio:
Intestazioni di risposta
Server Apache-Coyote/1.1 Content-Type text/html;charset=utf-8 Content-Length 1070 Date Sun, 18 Sep 2011 17:00:35 GMT
Richiedi intestazioni
Host localhost:8080 User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2 Accept application/json, text/javascript, */*; q=0.01 Accept-Language en-us,en;q=0.5 Accept-Encoding gzip, deflate Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 Connection keep-alive X-Requested-With XMLHttpRequest Referer http://localhost:8080/web/weather Cookie JSESSIONID=7D27FAC18050ED84B58DAFB0A51CB7E4
Nota interessante:
Ottengo 406 errori, ma la query di ibernazione funziona nel frattempo. Questo è ciò che dice tomcat log, ogni volta che cambio la selezione in dropbox:
select weather0_.ID as ID0_0_, weather0_.CITY_ID as CITY2_0_0_, weather0_.DATE as DATE0_0_, weather0_.TEMP as TEMP0_0_ from WEATHER weather0_ where weather0_.ID=?
Quale potrebbe essere il problema? C’erano due domande simili in SO prima, ho provato tutti i suggerimenti accettati lì, ma non hanno funzionato credo …
Eventuali suggerimenti? Sentiti libero di fare domande …
406 Non accettabile
La risorsa identificata dalla richiesta è in grado di generare solo entity framework di risposta che hanno caratteristiche di contenuto non accettabili secondo le intestazioni di accettazione inviate nella richiesta.
Quindi, la tua richiesta accetta header è application / json e il tuo controller non è in grado di restituirlo. Ciò accade quando non è ansible trovare il corretto HTTPMessageConverter per soddisfare il valore di ritorno annotato @ResponseBody. HTTPMessageConverter viene registrato automaticamente quando si utilizza
, in base a determinate librerie di terze parti nel classpath.
O non hai la libreria Jackson corretta nel tuo classpath, o non hai usato la direttiva
.
Ho replicato con successo il tuo scenario e ha funzionato bene usando queste due librerie e senza headers="Accept=*/*"
direttiva headers="Accept=*/*"
.
Ho avuto lo stesso problema, con l’ultima versione 4.1.1 in poi è necessario aggiungere i seguenti jar a pom.xml.
com.fasterxml.jackson.core jackson-core 2.4.1 com.fasterxml.jackson.core jackson-databind 2.4.1.1
assicurati anche di avere il seguente contenitore:
org.codehaus.jackson jackson-core-asl 1.9.13 org.codehaus.jackson jackson-mapper-asl 1.9.13
406 Spring MVC Json, non accettabile secondo la richiesta “accetta” intestazioni
C’è un altro caso in cui questo stato verrà restituito: se il mappatore Jackson non riesce a capire come serializzare il bean. Ad esempio, se si dispone di due metodi di accesso per la stessa proprietà booleana, isFoo()
e getFoo()
.
Quello che sta succedendo è che Spring’s MappingJackson2HttpMessageConverter chiama lo StdSerializerProvider di Jackson per vedere se può convertire il tuo object. Nella parte inferiore della catena di chiamate, StdSerializerProvider._createAndCacheUntypedSerializer
genera una JsonMappingException
con un messaggio informativo. Tuttavia, questa eccezione viene inghiottita da StdSerializerProvider._createAndCacheUntypedSerializer
, che indica a Spring che non può convertire l’object. Essendo a corto di convertitori, Spring riporta che non gli viene data un’intestazione Accept
che può usare, il che ovviamente è fasullo quando lo si assegna */*
.
C’è un bug per questo comportamento, ma è stato chiuso come “non può riprodurre”: il metodo che viene chiamato non dichiara che può essere lanciato, quindi le eccezioni di deglutizione sono apparentemente una soluzione appropriata (sì, era il sarcasmo). Sfortunatamente, Jackson non ha alcuna registrazione … e ci sono molti commenti nel codice base che lo desiderano, quindi sospetto che questo non sia l’unico trucchetto nascosto.
Ho avuto lo stesso problema, il mio metodo controller viene eseguito ma la risposta è Errore 406. AbstractMessageConverterMethodProcessor#writeWithMessageConverters
debug di AbstractMessageConverterMethodProcessor#writeWithMessageConverters
e AbstractMessageConverterMethodProcessor#writeWithMessageConverters
trovato che il metodo ContentNegotiationManager#resolveMediaTypes
restituisce sempre text/html
che non è supportato da MappingJacksonHttpMessageConverter
. Il problema è che org.springframework.web.accept.ServletPathExtensionContentNegotiationStrategy
funziona prima di org.springframework.web.accept.HeaderContentNegotiationStrategy
e l’estensione della mia richiesta /get-clients.html
è la causa del mio problema con l’errore 406. Solo cambiato richiesta url a /get-clients
.
Assicurati che i seguenti 2 jar
siano presenti nel percorso della class.
Se uno o entrambi mancano, verrà questo errore.
jackson-core-asl-1.9.X.jar jackson-mapper-asl-1.9.X.jar
Finalmente trovato la risposta da qui:
Mappatura di richieste di ajax riposanti alla spring
Quoto:
Le annotazioni @ RequestBody / @ ResponseBody non utilizzano i normali resolver di vista, utilizzano i propri HttpMessageConverters. Per utilizzare queste annotazioni, è necessario configurare questi convertitori in AnnotationMethodHandlerAdapter, come descritto nel riferimento (probabilmente è necessario MappingJacksonHttpMessageConverter).
Controllare
in dispatcherservlet.xml, se non aggiungerlo. E aggiungi
org.codehaus.jackson jackson-core-asl 1.9.13 org.codehaus.jackson jackson-mapper-asl 1.9.13
queste dipendenze nel tuo pom.xml
com.fasterxml.jackson.jaxrs jackson-jaxrs-base 2.6.3
Nel controller, l’annotazione del corpo della risposta non deve essere sul tipo restituito e non sul metodo, in questo modo:
@RequestMapping(value="/getTemperature/{id}", headers="Accept=*/*", method = RequestMethod.GET) public @ResponseBody Weather getTemparature(@PathVariable("id") Integer id){ Weather weather = weatherService.getCurrentWeather(id); return weather; }
Userò anche la funzione raw jquery.ajax e assicurarmi che contentType e dataType siano impostati correttamente.
Su una nota diversa, trovo la gestione primaverile di JSON piuttosto problematica. È stato più facile quando ho fatto tutto da solo utilizzando le stringhe e GSON.
Stavo avendo lo stesso problema perché mi mancava l’annotazione @EnableMvc. (Tutta la mia configurazione di spring è basata sull’annotazione, l’equivalente XML sarebbe mvc: annotation-driven)
assicurati di avere la versione corretta di Jackson nel tuo classpath
Controlla come @joyfun ha fatto per la versione corretta di jackson, ma controlla anche le nostre intestazioni … Accetta / non può essere trasmesso dal client … usa firebug o equivalente per verificare che cosa sta effettivamente inviando la tua richiesta di ottenere. Penso che l’attributo delle intestazioni dell’annotazione / possa / essere controllato letterali anche se non sono sicuro al 100%.
A parte gli ovvi problemi ne ho avuto un altro che non ho potuto correggere a prescindere dall’includere tutti i possibili JAR, dipendenze e annotazioni nel servlet Spring. Alla fine ho scoperto che ho un’estensione di file sbagliata, voglio dire che avevo due servlet separati in esecuzione nello stesso contenitore e che dovevo mappare a estensioni di file diverse dove uno era “.do” e l’altro come usato per le iscrizioni è stato chiamato in modo casuale “. sub”. Tutto bene ma SUB è un’estensione di file valida normalmente usata per i file di sottotitoli dei film e quindi Tomcat stava eseguendo l’override dell’intestazione e restituiva qualcosa come “text / x-dvd.sub …” quindi tutto andava bene ma l’applicazione si aspettava JSON ma otteneva i sottotitoli quindi tutto ciò che dovevo fare è cambiare la mapping nel mio file web.xml
che ho aggiunto:
sub application/json
Ho avuto lo stesso problema, purtroppo, la soluzione non ha risolto il mio problema in quanto il mio problema era qualcosa in una class diversa.
Per prima cosa ho controllato che tutte le dipendenze fossero presenti come suggerito da @bekur, quindi ho controllato la richiesta / risposta che viaggiava dai client al server e tutte le intestazioni erano posizionate correttamente da Jquery. Ho quindi controllato i MessageConverters
RequestMappingHandlerAdapter
e tutti e 7 sono stati RequestMappingHandlerAdapter
, ho davvero iniziato a odiare Spring! Ho quindi aggiornato da Spring 4.0.6.RELEASE
a 4.2.0.RELEASE
Ho ottenuto un’altra risposta piuttosto che sopra. È stata Request processing failed; nested exception is java.lang.IllegalArgumentException: No converter found for return value of type
Request processing failed; nested exception is java.lang.IllegalArgumentException: No converter found for return value of type
Ecco il mio metodo di controllo
@RequestMapping(value = "/upload", method = RequestMethod.POST,produces = "application/json") public ResponseEntity pictureUpload(FirewalledRequest initialRequest) { DefaultMultipartHttpServletRequest request = (DefaultMultipartHttpServletRequest) initialRequest.getRequest(); try { Iterator iterator = request.getFileNames(); while (iterator.hasNext()) { MultipartFile file = request.getFile(iterator.next()); session.save(toImage(file)); } } catch (Exception e) { return new ResponseEntity(new UploadPictureResult(),HttpStatus.INTERNAL_SERVER_ERROR); } return new ResponseEntity (new UploadPictureResult(), HttpStatus.OK); } public class UploadPictureResult extends WebResponse{ private List images; public void setImages(List images) { this.images = images; } } public class WebResponse implements Serializable { protected String message; public WebResponse() { } public WebResponse(String message) { this.message = message; } public void setMessage(String message) { this.message = message; } }
La soluzione era rendere UploadPictureResult non estendere WebResponse
Per qualche motivo, spring non è stata in grado di determinare come convertire UploadPictureReslt quando ha esteso WebResponse
com.fasterxml.jackson.core jackson-databind 2.8.0
non uso l’autenticazione ssl e questo database-jackson contiene jackson-core.jar e jackson-databind.jar, e quindi cambio il contenuto di RequestMapping in questo modo:
@RequestMapping(value = "/id/{number}", produces = "application/json; charset=UTF-8", method = RequestMethod.GET) public @ResponseBody Customer findCustomer(@PathVariable int number){ Customer result = customerService.findById(number); return result; }
attenzione: se la tua produzione non è di tipo “application / json” e non l’avevo notato e ho ricevuto un errore 406, questo può aiutarti.
Come @atott menzionato .
Se hai aggiunto l’ultima versione di Jackson nel tuo pom.xml e con Spring 4.0 o più recente, utilizza @ResponseBody
sul tuo metodo di azione e @RequestMapping
configurato con produces="application/json;charset=utf-8"
, tuttavia, hai ancora 406 (Non accettabile), suppongo tu debba provarlo nella configurazione del tuo contesto MVC DispatcherServlet:
È così che ho risolto il problema alla fine.
controlla questa discussione spring mvc restcontroller return json string p / s: dovresti aggiungere jack son mapping config alla tua class WebMvcConfig
@Override protected void configureMessageConverters( List
> converters) { // put the jackson converter to the front of the list so that application/json content-type strings will be treated as JSON converters.add(new MappingJackson2HttpMessageConverter()); // and probably needs a string converter too for text/plain content-type strings to be properly handled converters.add(new StringHttpMessageConverter()); }
Questa è la risposta di aggiornamento per springVersion = 5.0.3.RELEASE.
Quelle risposte di cui sopra saranno utilizzate solo nella versione precedente SpringVersion <4.1 . per l’ultima spring devi aggiungere le seguenti dipendenze nel file gradle:
compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: fasterxmljackson compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: fasterxmljackson fasterxmljackson=2.9.4
Spero che questo sarà utile per chi usa l’ultima versione di spring.
Spring 4.3.10: Ho utilizzato le seguenti impostazioni per risolvere il problema.
Passaggio 1: aggiungere le dipendenze sottostanti
com.fasterxml.jackson.core jackson-core 2.6.7 com.fasterxml.jackson.core jackson-databind 2.6.7 org.codehaus.jackson jackson-core-asl 1.9.13 org.codehaus.jackson jackson-mapper-asl 1.9.13
Passaggio 2: aggiungere il sotto nella configurazione del contesto MVC DispatcherServlet:
Dalla spring 3.2, come per la configurazione di default favorPathExtension è impostato come true, per questo se la richiesta uri ha delle estensioni appropriate come .htm
spring darà la priorità per l’estensione. Nel passaggio 2 avevo aggiunto il bean contentNegotiationManager per sovrascriverlo.
Puoi rimuovere l’elemento dell’intestazione in @RequestMapping e provare ..
Piace
@RequestMapping(value="/getTemperature/{id}", method = RequestMethod.GET)
@RequestMapping(value="/getTemperature/{id}", method = RequestMethod.GET)
Immagino che la spring faccia un ‘contiene controllo’ piuttosto che una corrispondenza esatta per accettare intestazioni. Ma ancora, vale la pena provare a rimuovere l’elemento delle intestazioni e controllare.