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

mvcahí? 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-drivenera igualmvc:annotation-driveo 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
MappingJacksonHttpMessageConverterpara Jackson 1 yMappingJackson2HttpMessageConverterpara 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._createAndCacheUntypedSerializerlanza unJsonMappingExceptioncon 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 unAcceptencabezado 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#writeWithMessageConvertersy encontré que el métodoContentNegotiationManager#resolveMediaTypessiempre devuelve lotext/htmlque no es compatible conMappingJacksonHttpMessageConverter. El problema es queorg.springframework.web.accept.ServletPathExtensionContentNegotiationStrategyfunciona antesorg.springframework.web.accept.HeaderContentNegotiationStrategyy la extensión de mi solicitud/get-clients.htmles 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
jaresté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.jarfuente
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
publicsí 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.SimpleImmutableEntryluego 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
@ResponseBodyno 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
@ResponseBodysu método de acción y@RequestMappingconfigurado 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
.htmprimavera, 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/libcarpeta, 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.xmlarchivo 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
RequestMappingHandlerAdapterMessageConvertersy los 7 estaban en su lugar, ¡realmente comencé a odiar Spring! Luego actualicé desde Spring4.0.6.RELEASEhasta4.2.0.RELEASEque obtuve otra respuesta en lugar de la anterior. EraRequest processing failed; nested exception is java.lang.IllegalArgumentException: No converter found for return value of typeAquí 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.4Espero 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?