10

我一直在做关于 Spring4 和 RestWS 集成的 poc。我对这两者都是新手,接触不到一周。我正在按照博客的说明进行操作。我知道在 Spring 4 和 restWS 设置中,jackson-core/anotation/databind 2 将用于 JSON <-> Java 对象的正确消息转换。也org.springframework.http.converter.json.MappingJackson2HttpMessageConverter将用于消息转换。我满足了所有这些要求。但是,当我尝试启动应用程序时,我得到 bean 创建异常。堆

严重:向 org.springframework.web.context.ContextLoaderListener 类的侦听器实例发送上下文初始化事件的异常
org.springframework.beans.factory.BeanCreationException:创建名为“regionController”的bean时出错:注入自动装配依赖项失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有 org.springframework.web.servlet.View com.leggmason.lmpamfs.controllers.RegionController.jsonView_i;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在 ServletContext 资源 [/WEB-INF/applicationContext.xml] 中定义名称为“org.springframework.web.servlet.view.json.MappingJacksonJsonView#0”的 bean 创建错误: bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 bean 类 [org.springframework.web.servlet.view.json.MappingJacksonJsonView]:构造函数抛出异常;
    在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
    在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
    在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
    在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
    在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
    在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
    在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
    在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
    在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    在 org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
    在 org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    在 org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
    在 org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4961)
    在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5455)
    在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    在 java.util.concurrent.FutureTask.run(未知来源)
    在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源)
    在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源)
    在 java.lang.Thread.run(未知来源)
引起:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有 org.springframework.web.servlet.View com.leggmason.lmpamfs.controllers.RegionController.jsonView_i; 嵌套异常是 org.springframework.beans.factory.BeanCreationException:在 ServletContext 资源 [/WEB-INF/applicationContext.xml] 中定义名称为“org.springframework.web.servlet.view.json.MappingJacksonJsonView#0”的 bean 创建错误: bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 bean 类 [org.springframework.web.servlet.view.json.MappingJacksonJsonView]:构造函数抛出异常;嵌套异常是 java.lang.NoClassDefFoundError: org/codehaus/jackson/map/ObjectMapper
    在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
    在 org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
    在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
    ... 22 更多
原因:org.springframework.beans.factory.BeanCreationException:创建名称为 'org.springframework.web.servlet.view.json.MappingJacksonJsonView#0' 在 ServletContext 资源 [/WEB-INF/applicationContext.xml] 中定义的 bean 时出错: bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 bean 类 [org.springframework.web.servlet.view.json.MappingJacksonJsonView]:构造函数抛出异常;嵌套异常是 java.lang.NoClassDefFoundError: org/codehaus/jackson/map/ObjectMapper
    在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1076)
    在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1021)
    在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
    在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
    在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
    在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
    在 org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1017)
    在 org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960)
    在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)
    在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
    ... 24 更多
引起:org.springframework.beans.BeanInstantiationException:无法实例化bean类[org.springframework.web.servlet.view.json.MappingJacksonJsonView]:构造函数抛出异常;嵌套异常是 java.lang.NoClassDefFoundError: org/codehaus/jackson/map/ObjectMapper
    在 org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:164)
    在 org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89)
    在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1069)
    ... 35 更多
引起:java.lang.NoClassDefFoundError: org/codehaus/jackson/map/ObjectMapper
    在 org.springframework.web.servlet.view.json.MappingJacksonJsonView.(MappingJacksonJsonView.java:65)
    在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    在 sun.reflect.NativeConstructorAccessorImpl.newInstance(未知来源)
    在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知来源)
    在 java.lang.reflect.Constructor.newInstance(未知来源)
    在 org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
    ... 37 更多
引起:java.lang.ClassNotFoundException:org.codehaus.jackson.map.ObjectMapper
    在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702)
    在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
    ... 43 更多

MappingJacksonJsonView类似乎有问题。从工厂文件中遵循可能会导致麻烦吗?

 <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">  
       <property name="contentType" value="text/plain"/>  
  </bean>  

我也应该替换这个类吗?我将帮助解决此问题。

谢谢, 苏沃吉特

4

2 回答 2

25

您当前正在使用MappingJacksonJsonView旨在与Jackson1一起使用的。

您提到以下内容:

我没有使用 Jackson 1 api。我的库中的 jar 是 jackson-core-2.0.2、jackson-annotation-2.3.0、jackson-bindings 2.3.0。

这意味着您的类路径中有Jackson2。Jackson1 和 Jackson2 不兼容(不同的包、不同的类等)。

您有 2 种可能的解决方案

  1. 不要使用Jackson2并将您的依赖项切换到Jackson1
  2. 替换MappingJacksonJsonViewMappingJackson2JsonView
于 2014-05-14T07:00:26.387 回答
1

对于 Spring4 Rest + Json POC 下面的 App Context 就足够了

<?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/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        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">
    <context:component-scan base-package="org.name.controller" />
    <!-- Enables the Spring MVC @Controller programming model -->
    <mvc:annotation-driven />
    <mvc:resources location="/statics/" mapping="/statics/**"/>
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

确保你对 Jackson 有依赖(例如在 maven 中)

<!-- jackson so spring mvc will handle json responses out of the box -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.3.0</version>
</dependency>

您不需要特别定义 MappingJackson2JsonView;MappingJackson2HttpMessageConverter/MappingJacksonHttpMessageConverter在jackson为类路径时会自动创建(默认只有ContentType/Accept为application/json时)。

Jackson1 已被弃用,但如果出于任何原因您仅限于 Jackson1,仍受支持 请参阅 Spring 4 文档

于 2014-05-13T13:46:09.440 回答