traduccion - Spring 3.x estado JSON 406 "características no aceptables según la solicitud" aceptar "encabezados()"
spring traduccion (14)
Al tratar de obtener mi respuesta en JSON
utilizando Spring 3.x
, obtengo el 406 error
"El recurso identificado por esta solicitud solo es capaz de generar respuestas con características no aceptables de acuerdo con los encabezados de request
" accept "()."
Aquí está mi entorno
* Spring 3.2.0.RELEASE
* included jackson-mapper-asl-1.7.9.jar, jackson-core-asl-1.7.9.jar
* Tomcat 6.x
* mvc:annotation-driven in Spring configuration XML file
Mi controlador:
@RequestMapping("/contest")
public class ContestController {
@RequestMapping(value="{name}", headers="Accept=*/*", method = RequestMethod.GET)
public @ResponseBody Contest getContestInJSON(@PathVariable String name) {
Contest contest = new Contest();
contest.setName(name);
contest.setStaffName(new String("contestitem1"));
return contest;
}
}
Archivo My Spring Configuration
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="com.contestframework.controllers" />
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
<entry key="atom" value="application/atom+xml"/>
<entry key="html" value="text/html"/>
<entry key="json" value="application/json"/>
</map>
</property>
<property name="viewResolvers">
<list>
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
</list>
</property>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
</list>
</property>
</bean>
<mvc:annotation-driven />
</beans>
Después de esto, acabo de acceder al controlador utilizando a continuación:
http://domain/SpringWebProject/json/contest/abcd
y la respuesta que recibo es Estado 406: "El recurso identificado por esta solicitud solo es capaz de generar respuestas con características no aceptables de acuerdo con los encabezados de solicitud" aceptar "()".
También probé un mecanismo alternativo accediendo a esto usando Javascript
AJAX
para asegurarme de que mi encabezado de solicitud tiene application/JSON
pero esto me llevó al mismo resultado de estado 406
$.getJSON(''contest/abcd'', function(data) {
console.log(data) }
Aquí está mi ENCUESTAS DE SOLICITUD capturadas desde el navegador:
Request URL:http://localhost:8080/SpringWebProject/json/contest/abcd
Request Method:GET
Status Code:406 Not Acceptable
Accept:application/json, text/javascript, */*; q=0.01
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Cookie:JSESSIONID=59689C95B0B9C21494EB0AB9D9F7BCCD
Host:localhost:8080
Referer:http://localhost:8080/SpringWebProject/json/welcome
User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4
X-Requested-With:XMLHttpRequest
Response Headersview source
Content-Length:1070
Content-Type:text/html;charset=utf-8
Date:Fri, 12 Oct 2012 18:23:40 GMT
Server:Apache-Coyote/1.1
Apreciar cualquier ayuda en este sentido.
Creo que debe agregar un produce = "application / json" a su @RequestMapping (no he mirado mvc de primavera en un momento, así que no estoy 100% positivo) ...
http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html
16.3.2.6 Tipos de medios de producción
Puede limitar el mapeo primario especificando una lista de tipos de medios producibles. La solicitud se emparejará solo si el encabezado de Solicitud de aceptación coincide con uno de estos valores. Además, el uso de la condición produce garantiza que el tipo de contenido real utilizado para generar la respuesta respete los tipos de medios especificados en la condición produce. Por ejemplo:
@Controller
@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json")
@ResponseBody
public Pet getPet(@PathVariable String petId, Model model) {
// implementation omitted
}
Dentro de poco:
Para Spring MVC 4.1.6 hay suficiente:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.0</version>
</dependency>
jackson-databind tiene dependencia de los artefactos de núcleo y anotaciones .
En detalles:
¿Qué es el error HTTP 406 ?
406 No aceptable El recurso solicitado solo puede generar contenido no aceptable de acuerdo con los encabezados Aceptar enviados en la solicitud.
Significa que el Servidor no puede generar el contenido que MEDIA TYPE indicó en Accept Header.
¿Pero cómo sabe el servidor qué tipo de medio puede generar y cuál no?
Spring Web tiene el concepto de HttpMessageConverter . Algunos de estos conversores ya están registrados en Spring y AbstractMessageConverterMethodArgumentResolver mantiene en la propiedad messageConverters .
Durante el proceso de solicitud, AbstractMessageConverterMethodProcessor analiza qué resorte puede convertir y guarda todos los TIPOS DE MEDIOS admitidos en la variable producibleMediaTypes . Si no se puede producir MEDIA TYPE, entonces dice Error 406 == No puedo generar el tipo de medio solicitado. Lo siento.
Para abreviar, basta con registrar convertidores. En tu caso, es la biblioteca de jackson la que produce la aplicación / json
Gracias por compartir tu experiencia. Experimenté el mismo problema y me funciona usando la configuración como se muestra a continuación:
- Spring MVC Version: 3.2.5.RELEASE
- Apache-tomcat-6.0.24
- JDK1.6
- jackson-core-asl-1.9.10.jar
- jackson-mapper-asl-1.9.10.jar
Archivo de configuración Spring MVC:
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<!-- Turn off working out content type based on URL file extension, should fall back to looking at the Accept headers -->
<property name="favorPathExtension" value="false" />
</bean>
Clase de modelo: Country.java
private Integer countryId;
private String name;
//public setters and getters
Método del controlador:
@RequestMapping(value = "/get_country_json",method = RequestMethod.GET)
@ResponseBody
public Country getCountry()
Descriptor de implementación (web.xml)
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
URL solicitada para llamar al método del controlador: /SpringCURDApp/get_country_json.htm
Espero que esto pueda ayudar a alguien.
No cometa el mismo error que yo, pasé todo el día jugando con la configuración de Spring, cuando en realidad su objeto devuelto en un servicio web no coincide con XML correctamente. Parece que Spring detecta un error de clasificación JAXB y no lo informa. Utilice este código de espacio aislado para validar referencias JAXB:
MyClass myclass = new MyClass();
//populate myclass here
JAXBContext context = JAXBContext.newInstance(MyClass.class);
Marshaller m = context.createMarshaller();
StringWriter w = new StringWriter();
m.marshal(myclass, w);
System.out.println(w);
Esto produjo y mostró una excepción. Se corrigió la causa y mi servicio web está disponible tanto en XML como en JSON.
No hay nada de malo en su configuración, permítanme sugerir algunos pequeños cambios:
a) Sus espacios de nombres aparecen incorrectos: se refieren a los esquemas 3.0, simplemente cámbielos a 3.1 uno o no haga referencia a la versión explícitamente, de esta manera, por ejemplo.
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
O
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
b) No necesita ContentNegotiatingViewResolver, puede eliminar todo menos el component-scan
y <mvc:annotation-driven/>
de su configuración
c) La solicitud no funcionará directamente desde el navegador, ya que requiere explícitamente un encabezado Aceptar de "application / json" - la llamada $.getJson
debería funcionar, ya que envía los encabezados correctos
d) Elimine los headers=Acc..
de @RequestMapping, y produce también, ambos son criterios de filtrado para hacer coincidir la llamada al método correlacionado correcto.
Con estos, no hay ninguna razón por la cual el json no debería ser atendido, ¿pueden intentarlo y ver cómo funciona?
Por favor, vea http://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-config-content-negotiation Como puede ver
"Para las extensiones de archivo en el URI de solicitud, la configuración MVC Java y el espacio de nombres MVC, automáticamente se registran extensiones como .json, .xml, .rss y .atom si las dependencias correspondientes, como Jackson, JAXB2 o Rome, están presentes en la ruta de clase ".
Debería agregar ".json" al final de URI (como http://domain/SpringWebProject/json/contest/abcd.json ) Funciona para mí.
Si está utilizando Spring 4, solo debe actualizar sus bibliotecas:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.3.0</version>
</dependency>
Tal vez deberías actualizar tu biblioteca de jackson. Uso Spring v4.3.8 y lo uso de la siguiente manera:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.7</version>
</dependency>
También acabo de experimentar este mismo problema. Parece que es un problema con el último 3.2.0.RELEASE, ya que tenía 3.1.2.RELEASE y todo funcionó. Después de cambiar a 3.2.0.RELEASE se rompe. Han probado con 3.1.3.RELEASE y eso funciona bien. Así que por ahora sugeriría volver a 3.1.3.RELEASE
EDITAR: Gracias a otra publicación en este sitio que enlazó a la siguiente ubicación: http://static.springsource.org/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-config-content-negotiation
Ahora lo tengo funcionando al deshabilitar la obtención del tipo de medio basado en la extensión de la ruta solicitada. Esto se puede hacer de la siguiente manera:
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<!-- Turn off working out content type based on URL file extension, should fall back to looking at the Accept headers -->
<property name="favorPathExtension" value="false" />
</bean>
Y especifique la versión 3.2 para todas las ubicaciones de esquema xsd.
Y esto es usando los siguientes jarrones jackson:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.1.2</version>
</dependency>
Tuve el mismo problema y el comentario agregado por Biju Kunjummen en esta respuesta funcionó perfectamente para mí
https://.com/a/12873170/20654
Eso es tener getters públicos en mi clase de Java
Tuve el mismo problema y lo resolví agregando la siguiente dependencia
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>${jackson.version}</version>
</dependency>
Previamente lo hago con la siguiente dependencia
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${com.jackson.core-version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${com.jackson.core-version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${com.jackson.core-version}</version>
</dependency>
En resumen, tengo que reemplazar com.fasterxml.jackson.core por org.codehaus.jackson
Tuve este problema en Spring MVC 4. La adición de jackson-annotations, jackson-core y jackson-databind no resolvió el problema. Prueba esta libs:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
Tuve un problema similar, pero fue extraño. Explicaré cómo lo resolví.
En mi web.xml mi servlet dispacher fue mapeado a * .htm
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
y no importa lo que hice siempre lanzó -
El recurso identificado por esta solicitud solo es capaz de generar respuestas con características no aceptables de acuerdo con el encabezado "aceptar" de la solicitud.
Finalmente lo cambié a
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Y funcionó. Lo que creo es cuando solo especificas
<mvc:annotation-driven/>
la extensión tiene prioridad sobre el encabezado accept y .htm estaba creando problemas. Y obviamente no pude usar xml o json ya que el propio servlet no estaba mapeado.
También me gustaría agregar que produce una anotación que usted, la primavera intentará mapear aceptará el encabezado de la solicitud entrante. Estaba haciendo un método de manejo de solicitudes genérico para json y xml. Dado que estoy usando Java 8 y Jaxb está incorporado en Java desde Java 7, no hay necesidad de la dependencia de JAXB. Para json, solo necesitaba agregar
<dependency org="com.fasterxml.jackson.core" name="jackson-databind" rev="2.8.5"/>
Estoy usando hiedra para la gestión de la dependencia.
Tuve un problema similar, se resolvió cuando agregué la biblioteca jackson-databind
.
Estas son mis dependencias:
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.12</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.3</version>
</dependency>