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

use*_*721 3 spring json 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)
Run Code Online (Sandbox Code Playgroud)

根本原因

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)
Run Code Online (Sandbox Code Playgroud)

控制器中的方法

@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;
}
Run Code Online (Sandbox Code Playgroud)

调度程序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>
Run Code Online (Sandbox Code Playgroud)

我正在使用杰克逊罐子

  • 杰克逊核心ASL-1.9.0.jar
  • 杰克逊映射器-ASL-1.9.0.jar
  • JSON-LIB-0.9.jar

和Spring版本是3.2.4

Rob*_*ake 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;
}
Run Code Online (Sandbox Code Playgroud)

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