Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring MVC + JSON = 406 Not Acceptable

Tags:

java

json

spring

I'm trying to generate a simple JSON response working. Right now I get 406 Not Acceptable error. Tomcat says "The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers." even though my Accept headers are

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 

In tomcat/lib I have all Tomcat jars, Spring jars and jackson-all-1.9.0.jar. I'm using Spring 3.2.2 with Tomcat 7.

I'm aware that this issue has been discussed many times, but none of solutions is working for me.

web.xml

<web-app id="WebApp_ID" version="2.4"      xmlns="http://java.sun.com/xml/ns/j2ee"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee      http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">    <display-name>Spring Web MVC Application</display-name>    <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

<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-2.5.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">      <bean id="viewResolver"         class="org.springframework.web.servlet.view.InternalResourceViewResolver" >         <property name="prefix">             <value>/WEB-INF/pages/</value>         </property>         <property name="suffix">             <value>.jsp</value>         </property>     </bean>  <context:component-scan base-package="com.smiechmateusz.controller" />  <context:annotation-config />      <mvc:annotation-driven />  </beans> 

HelloWorldController.java

package com.smiechmateusz.controller;  import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;  import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractController;  import com.smiechmateusz.dao.Foo;  @Controller @RequestMapping("/") public class HelloWorldController extends AbstractController{      @Override     protected ModelAndView handleRequestInternal(HttpServletRequest request,         HttpServletResponse response) throws Exception {          ModelAndView model = new ModelAndView("HelloWorldPage");         return model;     }      @RequestMapping(value="foobar.htm", method = RequestMethod.GET)     public @ResponseBody Foo getShopInJSON() {         Foo f = new Foo();         f.setX(1);         f.setY(2);         f.setDescription("desc");         return f;     } } 

Foo.java

package com.smiechmateusz.dao;  import java.io.Serializable;  import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table;  @Entity @Table(name="foobaz") public class Foo implements Serializable {     private int x, y;     String description;     int id;      @Column(name = "x")     public int getX() {         return x;     }     public void setX(int x) {         this.x = x;     }     @Column(name = "y")     public int getY() {         return y;     }     public void setY(int y) {         this.y = y;     }     @Column(name = "description")     public String getDescription() {         return description;     }     public void setDescription(String description) {         this.description = description;     }      @Id @GeneratedValue     @Column(name = "id")     public int getId() {         return id;     }     public void setId(int id) {         this.id = id;     } } 

I've already tried adding

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">         <property name="messageConverters">           <list>             <ref bean="jsonConverter"/>           </list>     </property> </bean> 

to my dispatcher-servlet.xml or changing jakcson-all to jackson-asl and jackson-core-asl but output was the same.

like image 797
Mateusz Avatar asked May 02 '13 10:05

Mateusz


People also ask

What does 406 not acceptable mean?

The HyperText Transfer Protocol (HTTP) 406 Not Acceptable client error response code indicates that the server cannot produce a response matching the list of acceptable values defined in the request's proactive content negotiation headers, and that the server is unwilling to supply a default representation.

What is MediaType Application_json_value?

APPLICATION_JSON is a "public constant media type for application/json ", whereas MediaType. APPLICATION_JSON_VALUE is a "String equivalent of MediaType. APPLICATION_JSON ". Attributes on Java annotations can only be one of a limited set of types. This prevents MediaType from being used as an annotation attribute.


2 Answers

If you're using Maven and the latest Jackson code then you can remove all the Jackson-specific configuration from your spring configuration XML files (you'll still need an annotation-driven tag <mvc:annotation-driven/>) and simply add some Jackson dependencies to your pom.xml file. See below for an example of the dependencies. This worked for me and I'm using:

  • Apache Maven 3.0.4 (r1232337; 2012-01-17 01:44:56-0700)
  • org.springframework version 3.1.2.RELEASE
  • spring-security version 3.1.0.RELEASE.

    ...<dependencies> ...     <dependency>         <groupId>com.fasterxml.jackson.core</groupId>         <artifactId>jackson-core</artifactId>         <version>2.2.3</version>     </dependency>     <dependency>         <groupId>com.fasterxml.jackson.core</groupId>         <artifactId>jackson-databind</artifactId>         <version>2.2.3</version>     </dependency>     <dependency>         <groupId>com.fasterxml.jackson.core</groupId>         <artifactId>jackson-annotations</artifactId>         <version>2.2.3</version>     </dependency>     ... </dependencies>... 
like image 180
KSev Avatar answered Sep 29 '22 06:09

KSev


One more way you can get this error is to create a class with no public members. 406 unacceptable is a pretty useless error message in this scenario.

like image 36
Doo Dah Avatar answered Sep 29 '22 05:09

Doo Dah