I just started learning the Virgo Web Server. I'm trying to work with Jakcson JSON in Spring MVC application. At this stage I can not get a GET request serialized object. The server returns "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 ().
The same problem arises when using Rome and JAXB2.
Here is the project configuration files and 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>
MANIFEST.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>
AJAX Request http://localhost:8080/greenpages/json.htm: Request Headers from 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
Response Headers:
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
In what may be the problem?
Spring falls back to returning a 406 if it can't find a json converter.
Verify that the jackson jars are actually deployed to the webapp's lib directory. This was the problem in my case.