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 />
Recibiendo 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
Solicitar encabezados
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 tomcat log, 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? Había dos preguntas similares en SO antes, probé todas las sugerencias aceptadas allí, pero supongo que no funcionaron ...
¿Alguna sugerencia? Siéntase libre de hacer preguntas...
mvc
ahí? Solía<tx:annotation-driven />
y TX esxmlns:tx="http://www.springframework.org/schema/tx"
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
y jarras spring-web-3.0.xy spring-webmvc-3.0.x?tx:annotation-driven
era igualmvc:annotation-drive
o poco.Tuve el mismo problema, con Latest Spring 4.1.1 en adelante, debe agregar los siguientes frascos 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 jar:
<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 de acuerdo con la solicitud "aceptar" encabezados
fuente
MappingJacksonHttpMessageConverter
para Jackson 1 yMappingJackson2HttpMessageConverter
para Jackson 2. Cada uno de estos es lo suficientemente bueno para serializar / deserializar JSON. Solo necesita uno (elija Jackson 2, ya que tiene más funciones).Hay otro caso en el que se devolverá este estado: si el mapeador de Jackson no puede averiguar cómo serializar su bean. Por ejemplo, si tiene dos métodos de acceso para la misma propiedad booleana
isFoo()
ygetFoo()
.Lo que pasa es que la primavera de MappingJackson2HttpMessageConverter llama de Jackson StdSerializerProvider para ver si puede convertir su objeto. En la parte inferior de la cadena de llamadas,
StdSerializerProvider._createAndCacheUntypedSerializer
lanza unJsonMappingException
con un mensaje informativo. Sin embargo, esta excepción es absorbidaStdSerializerProvider._createAndCacheUntypedSerializer
, lo que le dice a Spring que no puede convertir el objeto. Al haberse quedado sin convertidores, Spring informa que no se le ha asignado unAccept
encabezado que pueda usar, lo que, por supuesto, es falso cuando lo está 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 lanzar, 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 desearían que lo hiciera, así que sospecho que este no es el único problema oculto.
fuente
Tuve el mismo problema, mi método de controlador se ejecuta pero la respuesta es el Error 406. Depuraré
AbstractMessageConverterMethodProcessor#writeWithMessageConverters
y encontré que el métodoContentNegotiationManager#resolveMediaTypes
siempre devuelve lotext/html
que no es compatible conMappingJacksonHttpMessageConverter
. El problema es queorg.springframework.web.accept.ServletPathExtensionContentNegotiationStrategy
funciona antesorg.springframework.web.accept.HeaderContentNegotiationStrategy
y 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 la solicitud a/get-clients
.fuente
Asegúrese de que los siguientes 2
jar
estén presentes en la ruta de clases.Si falta alguno o ambos, entonces aparecerá este error.
jackson-core-asl-1.9.X.jar jackson-mapper-asl-1.9.X.jar
fuente
Finalmente encontré la respuesta desde aquí:
Asignación de solicitudes de descanso ajax a spring
Yo cito:
fuente
Verifique
<mvc:annotation-driven />
dispatcherservlet.xml, si no, agréguelo. 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 su pom.xml
fuente
<dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-base</artifactId> <version>2.6.3</version> </dependency>
fuente
Probablemente nadie se esté desplazando hacia abajo hasta ahora, pero ninguna de las soluciones anteriores me lo solucionó, pero todos mis métodos getter
public
sí lo hicieron.Dejé mi visibilidad de getter en package-private; Jackson decidió que no podía encontrarlos y explotó. (Utilizándolo
@JsonAutoDetect(getterVisibility=NON_PRIVATE)
solo parcialmente lo arregló.fuente
AbstractMap.SimpleImmutableEntry
luego degradado aAbstractMap.SimpleEntry
, todavía sin dados, ya que no tiene un colocador para la clave. Se ha ido pojo en esto.Asegúrese de que el objeto enviado (Weather en este caso) contenga getter / setter
fuente
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 jquery.ajax sin procesar y me aseguraría de que contentType y dataType se estén configurando correctamente.
En una nota diferente, encuentro el manejo de primavera de json bastante problemático. Fue más fácil cuando lo hice todo yo mismo usando cuerdas y GSON.
fuente
@ResponseBody
no debería importar ... Buscaré en GSON ... pero aún así me gustaría que este JSON funcionara si es posible.Como mencionó @atott .
Si ha agregado la última versión de Jackson en su pom.xml, y con Spring 4.0 o más reciente, usando
@ResponseBody
su método de acción y@RequestMapping
configurado conproduces="application/json;charset=utf-8"
, sin embargo, todavía tiene 406 (No aceptable), supongo que debe probar esto 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" /> </bean>
Así es como finalmente resolví mi problema.
fuente
Spring 4.3.10: utilicé la siguiente configuración para resolver el problema.
Paso 1: agregue las siguientes dependencias
<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 la configuración de contexto de 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 la primavera 3.2, según la configuración predeterminada, favorPathExtension se establece como verdadero, debido a esto, si la solicitud uri tiene las extensiones adecuadas, como
.htm
primavera, dará prioridad a la extensión. En el paso 2, agregué el bean contentNegotiationManager para anular esto.fuente
Tenía el mismo problema porque me faltaba la anotación @EnableWebMvc. (Todas mis configuraciones de primavera están basadas en anotaciones, el equivalente XML sería mvc: controlado por anotaciones)
fuente
asegúrese de tener la versión correcta de Jackson en su classpath
fuente
WEB-INF/lib
carpeta, pero sigue siendo el mismo problema: /Verifique, como hizo @joyfun, la versión correcta de jackson, pero también verifique nuestros encabezados ... Aceptar / puede que no sea transmitido por el cliente ... use firebug o equivalente para verificar qué está enviando realmente su solicitud de obtención. Creo que el atributo de encabezados de la anotación / puede / estar verificando literales, aunque no estoy 100% seguro.
fuente
Aparte de los problemas obvios, tuve otro que no pude solucionar independientemente de incluir todos los JAR, dependencias y anotaciones posibles en el servlet Spring. Finalmente descubrí que tengo una extensión de archivo incorrecta, quiero decir que tenía dos servlet separados ejecutándose en el mismo contenedor y necesitaba asignar diferentes extensiones de archivo donde una era ".do" y la otra, como se usa para las suscripciones, tenía un nombre aleatorio ". sub". Todo bien, pero SUB es una extensión de archivo válida que normalmente se usa para archivos de subtítulos de películas y, por lo tanto, Tomcat anulaba el encabezado y devolvía algo como "texto / x-dvd.sub ...", así que todo estaba bien, pero la aplicación esperaba JSON pero obtenía subtítulos. por lo tanto, todo lo que tuve que hacer es cambiar la asignación en mi
web.xml
archivo que agregué:<mime-mapping> <extension>sub</extension> <mime-type>application/json</mime-type> </mime-mapping>
fuente
Tuve el mismo problema, desafortunadamente, ninguna de las soluciones aquí resolvió mi problema, ya que mi problema era algo de una clase diferente.
Primero verifiqué que todas las dependencias estén en su lugar como lo sugiere @bekur, luego verifiqué que la solicitud / respuesta que viaja de los clientes al servidor, todos los encabezados estaban en su lugar y configurados correctamente por Jquery. Luego revisé el
RequestMappingHandlerAdapter
MessageConverters
y los 7 estaban en su lugar, ¡realmente comencé a odiar Spring! Luego actualicé desde Spring4.0.6.RELEASE
hasta4.2.0.RELEASE
que obtuve otra respuesta en lugar de la anterior. EraRequest 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 fue hacer que UploadPictureResult no extendiera WebResponse
Por alguna razón, Spring no pudo determinar cómo convertir UploadPictureReslt cuando extendió WebResponse
fuente
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.0</version> </dependency>
No uso la autenticación SSL y este jackson-databind contiene jackson-core.jar y jackson-databind.jar, y luego cambio el contenido de RequestMapping de esta 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 su producción no es del tipo "application / json" y no me di cuenta de esto y obtuve un error 406, ayuda, esto puede ayudarlo.
fuente
revisa este hilo. spring mvc restcontroller return json string p / s: debe agregar la configuración de mapeo de jack son a su clase WebMvcConfig
fuente
Esta es la respuesta de actualización para springVersion = 5.0.3.RELEASE.
Las respuestas anteriores solo se trabajarán con versiones anteriores de springVersion <4.1 . para la última primavera, debe 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.
fuente
¿Puedes eliminar el elemento de encabezados en @RequestMapping e intentar ...
Me gusta
@RequestMapping(value="/getTemperature/{id}", method = RequestMethod.GET)
Supongo que Spring hace una 'verificación 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.
fuente
weatherService.getCurrentWeather(id);
"activó" ... así que algo funciona ... ¿es posible que aparezca 406 y la selección de Hibernate SQL funcione al mismo tiempo?