Spring Web应用程序,尝试发送响应为json抛出错误500错误

时间:2013-08-20 14:09:56

标签: json spring web-applications spring-mvc

我正在Spring框架中开发一个Web应用程序。当请求作为ModelAndView respose类型提供时。它运作良好,但当我尝试以json的形式提供响应时,它会抛出一个错误

例外

org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.NoSuchMethodError: org.codehaus.jackson.map.SerializationConfig.isEnabled(Lorg/codehaus/jackson/map/SerializationConfig$Feature;)Z
org.springframework.web.servlet.DispatcherServlet.triggerAfterCompletionWithError(DispatcherServlet.java:1259)

根本原因

java.lang.NoSuchMethodError: org.codehaus.jackson.map.SerializationConfig.isEnabled(Lorg/codehaus/jackson/map/SerializationConfig$Feature;)Z
org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.writeInternal(MappingJacksonHttpMessageConverter.java:193)

控制器中的方法

@RequestMapping(value="/getFBFriendsList",method=RequestMethod.GET)<br/>
public @ResponseBody List<String> getStatesList(HttpServletRequest req){<br/>
    List<String> statesList = null;
    try{<br/>
    statesList = new ArrayList<String>();<br/>
    //..here i am getting states from datebase and adding to list<br/>
    }<br/>
    catch(Exception e){}<br/>
    return statesList;
}

调度程序Servlet中的配置

<bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" >
    <property name="supportedMediaTypes" value="application/json" />
</bean>

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="jsonHttpMessageConverter" />
        </list>
    </property>
</bean>

<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass">
        <value>
            org.springframework.web.servlet.view.tiles2.TilesView
        </value>
    </property>
</bean>

我正在使用杰克森罐子

  • 杰克逊核-ASL-1.9.0.jar
  • 杰克逊映射器-ASL-1.9.0.jar
  • JS​​ON-LIB-0.9.jar

和Spring版本是3.2.4

3 个答案:

答案 0 :(得分:9)

看起来您至少需要使用Jackson 1.9.2或更高版本。在Jackson 1.9.0和1.9.1的源代码中,已删除org.codehaus.jackson.map.SerializationConfig.isEnabled()的方法定义。这就是您收到NoSuchMethodError异常的原因。

然后在Jackson 1.9.2的源代码中,您会看到以下内容:

/*
/**********************************************************
/* MapperConfig overrides for 1.8 backwards compatibility
/**********************************************************
 */

/* NOTE: these are overloads we MUST have, but that were missing
 * from 1.9.0 and 1.9.1. Type erasure can bite in the ass...
 *<p>
 * NOTE: will remove either these variants, or base class one, in 2.0.
 */

/** 
 * Alias for {@link MapperConfig#isEnabled(org.codehaus.jackson.map.MapperConfig.ConfigFeature)}.
 * 
 * @since 1.0 However, note that version 1.9.0 and 1.9.1 accidentally missed
 *    this overloaded variant
 */
public boolean isEnabled(SerializationConfig.Feature f) {
    return (_featureFlags & f.getMask()) != 0;
}

简而言之,不要将Jackson版本1.9.0或1.9.1与Spring MVC一起使用,因为Jackson开发人员删除了实际需要的内容。

答案 1 :(得分:0)

在@RequestMapping中提及生成属性,指定响应的媒体类型。

答案 2 :(得分:0)

使用jackson-all-1.9.9 jar,而不是使用更高(2.x.x)版本的jackson-core,jackson-annotations和jackson-databind或使用更早版本(低于1.9.2)的jackson-all版本。这是link