3

我正在 Spring 框架中开发一个 Web 应用程序。当请求作为 ModelAndView 响应类型提供服务时。它运行良好,但是当我尝试将响应作为 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
  • jackson-mapper-asl-1.9.0.jar
  • json-lib-0.9.jar

和 Spring 版本是 3.2.4

4

3 回答 3

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 开发人员删除了实际需要的内容。

于 2013-08-20T16:57:15.850 回答
0

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

于 2015-05-27T07:58:32.347 回答
0

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

于 2016-02-25T10:04:13.690 回答