Richiesta JSON di Spring che ottiene 406 (non accettabile)

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=*/*" .

  • Jackson-core-asl-1.7.4.jar
  • jackson-mapper-ASL-1.7.4.jar

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.