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>