406 Non acceptable dans l'application Spring MVC (OSGi, Virgo Web Server) utilisant Jackson, Rome et JAXB2
Je viens de commencer l'apprentissage de la Vierge Serveur Web.
Je suis en train de travailler avec Jakcson JSON dans Spring MVC de l'application.
À ce stade, je ne peux pas obtenir une demande d'OBTENIR les objets sérialisés.
Le serveur renvoie "406 not Acceptable":
The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers ().
Le même problème se pose lors de l'utilisation de Rome et JAXB2.
Voici les fichiers de configuration du projet et le code:
Fragment pom.xml:
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>com.springsource.org.codehaus.jackson</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>com.springsource.org.codehaus.jackson.mapper</artifactId>
<version>1.0.0</version>
</dependency>
MANIFESTE.MF
Manifest-Version: 1.0
Import-Bundle: com.springsource.org.apache.taglibs.standard;version="[
1.1.2,1.3)",com.springsource.org.codehaus.jackson;version="[1.0.0,1.0
.0]",com.springsource.org.codehaus.jackson.mapper;version="[1.0.0,1.0
.0]"
Bundle-Version: 2.3.0
Tool: Bundlor 1.0.0.RELEASE
Bundle-Name: GreenPages Web
Import-Library: org.springframework.spring;version="[3.0, 3.1)"
Bundle-ManifestVersion: 2
Bundle-SymbolicName: greenpages.web
Web-ContextPath: greenpages
Import-Package: javax.servlet.jsp.jstl.core;version="[1.1.2,1.2.0)",ja
vax.sql,org.apache.commons.dbcp,org.eclipse.virgo.web.dm;version="[2.
0.0, 3.0.0)",org.springframework.core.io;version="[3.0.0.RELEASE,3.1.
0)",org.springframework.stereotype;version="[3.0.0.RELEASE,3.1.0)",or
g.springframework.ui;version="[3.0.0.RELEASE,3.1.0)",org.springframew
ork.web.bind.annotation;version="[3.0.0.RELEASE,3.1.0)",org.springfra
mework.web.servlet.mvc.annotation;version="[3.0.0.RELEASE,3.1.0)",org
.springframework.web.servlet.view;version="[3.0.0.RELEASE,3.1.0)"
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<welcome-file-list>
<welcome-file>/WEB-INF/pages/index.jsp</welcome-file>
</welcome-file-list>
<!-- CONFIGURE A PARENT APPLICATION CONTEXT -->
<context-param>
<param-name>contextClass</param-name>
<param-value>org.eclipse.virgo.web.dm.ServerOsgiBundleXmlWebApplicationContext</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- DISPATCHER SERVLET CONFIG -->
<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>
</web-app>
dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<context:component-scan base-package="greenpages.web"/>
<!-- Configures the @Controller programming model -->
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
GreenPagesController.java
package greenpages.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class GreenPagesController {
@RequestMapping("/home.htm")
public void home() {
}
//MappingJacksonHttpMessageConverter (requires Jackson on the classpath - particularly useful for serving JavaScript clients that expect to work with JSON)
@RequestMapping(value="/json.htm", method=RequestMethod.POST)
public @ResponseBody String readJson(@RequestBody JavaBean bean) {
return "Read from JSON " + bean;
}
@RequestMapping(value="/json.htm", method=RequestMethod.GET)
public @ResponseBody Object writeJson() {
return new Object();
}
}
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Simple jsp page</title>
<script type="text/javascript" src="/greenpages/scripts/jquery-1.4.4.min.js"></script>
<script type="text/javascript">
$.getJSON("json.htm", function(message) {
console.log(message);
});
</script>
</head>
<body>
<form action="test.htm" method="get">
<input type="text" name="name">
<input type="submit">
</form>
</body>
</html>
Requête AJAX http://localhost:8080/greenpages/json.htm:
En-Têtes de demande de Firebug:
GET /greenpages/json.htm HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12
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
Keep-Alive: 115
Connection: keep-alive
X-Requested-With: XMLHttpRequest
Referer: http://localhost:8080/greenpages/
Cookie: JSESSIONID=18000E4E096D7978F61F5D1E8105B784; JSESSIONID=35FB0925786699EC587A1B64F30517AD
En-Têtes De Réponse:
HTTP/1.1 406 Not Acceptable
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 1070
Date: Tue, 07 Dec 2010 11:15:58 GMT
Dans ce qui pourrait être le problème?
source d'informationauteur Alexey
Vous devez vous connecter pour publier un commentaire.
Printemps revient au renvoi de la 406 si il ne peut pas trouver un json convertisseur.
Vérifier que les jackson pots sont effectivement déployées à la webapp répertoire lib. C'était le problème dans mon cas.
Assurez-vous d'avoir
<mvc:annotation-driven>
dansdispatcher-servlet.xml
- il configure le Printemps pour l'utilisation de nouvelles annotations telles que@ResponseBody
.Aussi je vois que vous avez une certaine confusion dans le contexte de configuration -
dispatcher-servlet.xml
est utilisé pour configurerDispatcherServlet
's contexte, il ne devrait pas être spécifié danscontextConfigLocation
du contexte parent.J'ai eu exactement le même problème et j'avais besoin de mettre le public les méthodes de lecture dans ma classe java
Voir: https://stackoverflow.com/a/18228476/20654
Voir http://www.checkupdown.com/status/E406.html pour plus de détails. Votre client app est de dire au serveur qu'il n'accepte pas le type de données renvoyé.
Je ne suis pas familier avec les libs, etc que vous utilisez, mais vous devriez être capable de regarder votre accepter les en-têtes par programmation (ou quelque chose comme Firebug) pour voir ce qui est à définir. Vous pouvez espérer alors que dans votre code source/de configuration.
À une supposition j'espère que votre client est exigeant JSON de revenir et de votre serveur n'est pas l'envoyer.
J'ai rencontré le même problème, et je me demandais si la suivantes peut en être la cause.
La AnnotationDrivenBeanDefinitionParser classe est chargée de vérifier le chemin de jaxb2 /jackson disponibilité. Il utilise la logique suivante:
Maintenant, normalement, le bundle du contexte de l'application serait de fournir un osgi-courant du chargeur de classe. Cependant, la jaxb2present variable est statique, et donc il est configuré de manière statique lorsque la classe est chargée, avant d'être instancié par le contexte de l'application. Je soupçonne que, à ce point dans le temps, le chargeur de classes n'est pas osgi-courant et donc il ne peut pas trouver la classe, il est à la recherche d'.
Pour l'instant, je suis en supposant que la seule solution est manuellement le fil d'un Jaxb2HttpMessageConverter (je ne sais pas comment faire 🙂
.springsource.org.codehaus.jackson.mapper;version="[1.4.3,1.4.3]"
aller.web.dm;version="[3.0.0, 4.0.0)",org.codehaus.jackson.carte;version="[1.4.3,1.4.3]"
@axtavt pourriez-vous s'il vous plaît laissez-moi savoir ce que vous voulez dire en n'ayant pas de déclaration explicite sur AnnotationMethodHandlerAdapter. J'éprouve de la déclaration ci-après dans ma servlet fichier et j'en suis 404.
Cela renvoie 406 erreur. Quand je tourne le type de retour int à la Chaîne, le problème a disparu.
Vous avez juste besoin de se débarrasser de @ResponseBody
J'ai eu un problème similaire où j'ai été prendre une 406 erreur, car l'objet java j'essayais de retour n'a pas été annoté avec une XmlRootElement au-dessus de la définition de la classe.
La méthode JSON retourné sans problème quand j'inclus l'Accepte=application/json en-tête de la demande, mais retourné 406 quand j'ai inclus les Accepter=application/xml en-tête de la demande
J'ai utilisé Postman de modifier les en-têtes et afficher les réponses. Outil très pratique.
J'ai eu le même message d'erreur. Mais j'ai utilisé des Annotations Java, j'ai toutes les dépendances nécessaires. Mais j'ai manqué d'annoter avec
mon
@Configuration
classe