with the springframework returned responded resource org not mvc httpclienterrorexception for failed example error code acceptable java javascript ajax json spring

java - the - server returned http response code 406 for url



Solicitud de Spring JSON obteniendo 406(no aceptable) (20)

406 no aceptable

El recurso identificado por la solicitud solo es capaz de generar entidades de respuesta que tienen características de contenido no aceptables según los encabezados de aceptación enviados en la solicitud.

Por lo tanto, su encabezado accept request es application / json y su controlador no puede devolverlo. Esto sucede cuando no se puede encontrar el HTTPMessageConverter correcto para satisfacer el valor de retorno anotado @ResponseBody. HTTPMessageConverter se registra automáticamente cuando utiliza <mvc:annotation-driven> , dado ciertas bibliotecas de parte 3-D en el classpath.

O no tiene la biblioteca correcta de Jackson en su classpath, o no ha usado la directiva <mvc:annotation-driven> .

Repliqué exitosamente su escenario y funcionó bien utilizando estas dos bibliotecas y sin headers="Accept=*/*" directiva.

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

este es mi javascript:

function getWeather() { $.getJSON(''getTemperature/'' + $(''.data option:selected'').val(), null, function(data) { alert(''Success''); }); }

este es mi controlador:

@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

<context:annotation-config /> <tx:annotation-driven />

Obteniendo este error:

GET http://localhost:8080/web/getTemperature/2 406 (Not Acceptable)

Encabezados:

Encabezados de respuesta

Server Apache-Coyote/1.1 Content-Type text/html;charset=utf-8 Content-Length 1070 Date Sun, 18 Sep 2011 17:00:35 GMT

Encabezados de solicitud

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 interesante:

Recibo el error 406, pero la consulta de hibernación funciona mientras tanto. Esto es lo que dice el registro de Tomcat, cada vez que cambio la selección en 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=?

¿Cuál podría ser el problema? Hubo dos preguntas similares en SO antes, probé todos los consejos aceptados, pero no funcionaron, supongo ...

¿Alguna sugerencia? No dude en hacer preguntas...


¿Puedes eliminar el elemento de encabezados en @RequestMapping y probar ...

Me gusta

@RequestMapping(value="/getTemperature/{id}", method = RequestMethod.GET)

Supongo que la primavera hace un "control de contenido" en lugar de una coincidencia exacta para aceptar encabezados. Pero aún así, vale la pena intentar eliminar el elemento de encabezados y verificar.


Aparte de los problemas obvios, tuve otro que no pude solucionar, independientemente de incluir todos los JAR, dependencias y anotaciones posibles en el servlet de Spring. Eventualmente descubrí que tengo una extensión de archivo incorrecta, quiero decir que tenía dos servlets separados en el mismo contenedor y necesitaba asignarme a diferentes extensiones de archivo donde una era ".do" y la otra, como se usaba para las suscripciones, se llamaba aleatoriamente ". sub". Todo bien, pero SUB es una extensión de archivo válida normalmente utilizada para archivos de subtítulos de películas y, por lo tanto, Tomcat estaba anulando el encabezado y devolviendo algo como "texto / x-dvd.sub ...", así que todo estaba bien, pero la aplicación esperaba JSON pero obtenía Subtitles por lo tanto, todo lo que tuve que hacer fue cambiar la asignación en mi archivo web.xml que agregué:

<mime-mapping> <extension>sub</extension> <mime-type>application/json</mime-type> </mime-mapping>


Asegúrese de que los siguientes 2 jar están presentes en la ruta de la clase.

Si alguno o ambos faltan, entonces este error vendrá.

jackson-core-asl-1.9.X.jar jackson-mapper-asl-1.9.X.jar


Como @atott mentioned .

Si ha agregado la última versión de Jackson en su pom.xml, y con Spring 4.0 o posterior, utilizando @ResponseBody en su método de acción y @RequestMapping configurado con produces="application/json;charset=utf-8" , sin embargo, todavía tienes 406 (No es aceptable), supongo que debes probar esto en tu configuración de contexto MVC DispatcherServlet:

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" /> <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> <property name="favorPathExtension" value="false" /> </bean>

Esa es la forma en que resolví mi problema finalmente.


Compruebe <mvc:annotation-driven /> en dispatcherservlet.xml, si no lo agregue. Y añadir

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

estas dependencias en tu pom.xml


Compruebe como @joyfun lo hizo para la versión correcta de jackson, pero también verifique nuestros encabezados ... Aceptar / no puede ser transmitido por el cliente ... use firebug o equivalente para verificar lo que realmente está enviando su solicitud de obtención. Creo que el atributo headers de la anotación / may / be verifica literales, aunque no estoy 100% seguro.


Desafortunadamente, tuve el mismo problema. La solución no solucionó mi problema porque mi problema era algo diferente.

Primero verifiqué que todas las dependencias están en su lugar según lo sugerido por @bekur y luego verifiqué la solicitud / respuesta que viaja de los clientes al servidor, todos los encabezados estaban en su lugar y correctamente establecidos por Jquery. Luego revisé los MessageConverters RequestMappingHandlerAdapter y los 7 de ellos estaban en su lugar, ¡realmente empecé a odiar a Spring! Luego actualicé desde Spring 4.0.6.RELEASE a 4.2.0.RELEASE Tengo otra respuesta en lugar de la anterior. Fue el 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

Aquí está mi método de controlador

@RequestMapping(value = "/upload", method = RequestMethod.POST,produces = "application/json") public ResponseEntity<UploadPictureResult> pictureUpload(FirewalledRequest initialRequest) { DefaultMultipartHttpServletRequest request = (DefaultMultipartHttpServletRequest) initialRequest.getRequest(); try { Iterator<String> iterator = request.getFileNames(); while (iterator.hasNext()) { MultipartFile file = request.getFile(iterator.next()); session.save(toImage(file)); } } catch (Exception e) { return new ResponseEntity<UploadPictureResult>(new UploadPictureResult(),HttpStatus.INTERNAL_SERVER_ERROR); } return new ResponseEntity<UploadPictureResult>(new UploadPictureResult(), HttpStatus.OK); } public class UploadPictureResult extends WebResponse{ private List<Image> images; public void setImages(List<Image> 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 solución era hacer UploadPictureResult para no extender WebResponse

Por algún motivo, Spring no pudo determinar cómo convertir UploadPictureReslt cuando se extendió WebResponse


En el controlador, ¿no debería la anotación del cuerpo de la respuesta estar en el tipo de retorno y no en el método, así:

@RequestMapping(value="/getTemperature/{id}", headers="Accept=*/*", method = RequestMethod.GET) public @ResponseBody Weather getTemparature(@PathVariable("id") Integer id){ Weather weather = weatherService.getCurrentWeather(id); return weather; }

También usaría la función raw jquery.ajax, y me aseguraré de que contentType y dataType se establezcan correctamente.

En una nota diferente, creo que el manejo de primavera de json es bastante problemático. Fue más fácil cuando lo hice todo usando cadenas y GSON.


Estaba teniendo el mismo problema porque me faltaba la anotación @EnableMvc. (Toda mi configuración de primavera está basada en anotaciones, el equivalente en XML sería mvc: anotado por la anotación)


Finalmente encontré la respuesta de aquí:

Mapeo de solicitudes ajax descansado a la primavera

Yo cito:

Las anotaciones de @ RequestBody / @ ResponseBody no usan los resolutores de vista normal, sino que usan sus propios HttpMessageConverters. Para utilizar estas anotaciones, debe configurar estos convertidores en AnnotationMethodHandlerAdapter, tal como se describe en la referencia (probablemente necesite MappingJacksonHttpMessageConverter).


Hay otro caso en el que se devolverá este estado: si el mapeador de Jackson no puede descifrar cómo serializar su frijol. Por ejemplo, si tiene dos métodos de acceso para la misma propiedad booleana, isFoo() y getFoo() .

Lo que sucede es que Spring''s MappingJackson2HttpMessageConverter llama a MappingJackson2HttpMessageConverter Jackson para ver si puede convertir su objeto. En la parte inferior de la cadena de llamadas, StdSerializerProvider._createAndCacheUntypedSerializer arroja una JsonMappingException con un mensaje informativo. Sin embargo, esta excepción la traga StdSerializerProvider._createAndCacheUntypedSerializer , que le dice a Spring que no puede convertir el objeto. Al haberse quedado sin convertidores, Spring informa que no se le ha asignado un encabezado de Accept que puede usar, lo que por supuesto es falso cuando se le da */* .

Hay un bug para este comportamiento, pero se cerró como "no se puede reproducir": el método que se llama no declara que puede arrojarse, por lo que tragar excepciones es aparentemente una solución apropiada (sí, eso fue sarcasmo). Desafortunadamente, Jackson no tiene ningún registro ... y hay muchos comentarios en la base de código que lo desearon, así que sospecho que este no es el único escondite oculto.


Primavera 4.3.10: utilicé la configuración siguiente para resolver el problema.

Paso 1: agrega las dependencias a continuación

<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.6.7</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.6.7</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-asl</artifactId> <version>1.9.13</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency>

Paso 2: agregue lo siguiente en su configuración de contexto MVC DispatcherServlet:

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/> <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> <property name="favorPathExtension" value="false"/> <property name="favorParameter" value="true"/> <property name="ignoreAcceptHeader" value="false" /> </bean>

Desde el resorte 3.2, según la configuración predeterminada, favorExtensiónPathExtension se establece como verdadera, debido a esto, si la solicitud uri tiene extensiones adecuadas, como .htm resorte dará prioridad a la extensión. En el paso 2, agregué el bean contentNegotiationManager para anular esto.


Tuve el mismo problema, con Latest Spring 4.1.1 en adelante necesita agregar los siguientes archivos jar a pom.xml.

<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.4.1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.4.1.1</version> </dependency>

también asegúrese de tener el siguiente contenedor:

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

406 Spring MVC Json, no aceptable según los encabezados de solicitud "aceptar"


Tuve el mismo problema, mi método de controlador se ejecuta pero la respuesta es Error 406. AbstractMessageConverterMethodProcessor#writeWithMessageConverters y encontré ese método ContentNegotiationManager#resolveMediaTypes siempre devuelve text/html que no es compatible con MappingJacksonHttpMessageConverter . El problema es que org.springframework.web.accept.ServletPathExtensionContentNegotiationStrategy funciona antes que org.springframework.web.accept.HeaderContentNegotiationStrategy , y la extensión de mi pedido /get-clients.html es la causa de mi problema con el error 406. Simplemente Se modificó la URL de solicitud a /get-clients .


asegúrate de tener la versión correcta de jackson en tu classpath


revisa este hilo. spring mvc restcontroller return json string p / s: debe agregar la configuración de asignación de jack son a su clase WebMvcConfig

@Override protected void configureMessageConverters( List<HttpMessageConverter<?>> 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()); }


Esta es la respuesta de actualización para springVersion = 5.0.3.RELEASE.

Esas respuestas anteriores solo se trabajarán en versiones anteriores de SpringVersion <4.1 . para la primavera más reciente tienes que agregar las siguientes dependencias en el archivo 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

Espero que esto sea útil para quienes usan la última versión de primavera.


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

No uso la autenticación ssl y esta conexión de datos de jackson contiene jackson-core.jar y jackson-databind.jar, y luego cambia el contenido RequestMapping de la siguiente manera:

@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; }

atención: si tu producto no es del tipo "aplicación / json" y no lo había notado y obtuve un error 406, ayuda esto puede ayudarte.


<dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-base</artifactId> <version>2.6.3</version> </dependency>