Pregunta Solicitud de Spring JSON obteniendo 406 (no aceptable)


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...


73
2017-09-18 14:42


origen


Respuestas:


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 usa el <mvc:annotation-driven>, dado ciertas bibliotecas de terceros en el classpath.

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

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

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

100
2017-09-19 10:11



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"


71
2017-10-28 19:07



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 está sucediendo es que Spring MappingJackson2HttpMessageConverter llama a Jackson StdSerializerProvider para ver si puede convertir tu objeto. En la parte inferior de la cadena de llamadas, StdSerializerProvider._createAndCacheUntypedSerializer arroja un JsonMappingException con un mensaje informativo. Sin embargo, esta excepción es tragada por StdSerializerProvider._createAndCacheUntypedSerializer, que le dice a Spring que no puede convertir el objeto. Habiéndose quedado sin convertidores, Spring informa que no se le está dando un Accept encabezado que puede usar, que por supuesto es falso cuando lo estás dando */*.

Hay un error para este comportamiento, pero se cerró como "no se puede reproducir": el método que se está llamando no declara que puede arrojar, 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.


14
2017-08-16 01:36



Tuve el mismo problema, mi método de controlador se ejecuta pero la respuesta es Error 406. Yo depuro AbstractMessageConverterMethodProcessor#writeWithMessageConvertersy encontré ese método ContentNegotiationManager#resolveMediaTypes siempre regresa text/html que no es compatible con MappingJacksonHttpMessageConverter. El problema es que org.springframework.web.accept.ServletPathExtensionContentNegotiationStrategy funciona antes que org.springframework.web.accept.HeaderContentNegotiationStrategyy la extensión de mi solicitud /get-clients.html es la causa de mi problema con el Error 406. Acabo de cambiar la URL de solicitud a /get-clients.


13
2018-01-06 23:17



Asegúrate de que después de 2 jarestán presentes en el camino 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

9
2018-06-01 12:28



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).


5
2017-09-19 07:42



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

2
2017-10-29 18:23