10

私は Spring4 と RestWS の統合について poc を行ってきました。私はどちらも初めてで、わずか1週間しか触れていません。私はブログからの指示に従っています。Spring 4 と restWS セットアップ jackson-core/anotation/databind 2 では、JSON <-> Java オブジェクトの正しいメッセージ変換を行うために使用されることを理解しています。org.springframework.http.converter.json.MappingJackson2HttpMessageConverterメッセージ変換にも使用されます。これらの要件をすべて満たしました。ただし、アプリケーションを起動しようとすると、Bean 作成例外が発生します。スタック

SEVERE: クラス org.springframework.web.context.ContextLoaderListener のリスナー インスタンスにコンテキスト初期化イベントを送信する例外
org.springframework.beans.factory.BeanCreationException: 'regionController' という名前の Bean の作成中にエラーが発生しました: 自動配線された依存関係の注入に失敗しました。ネストされた例外は org.springframework.beans.factory.BeanCreationException: Could not autowire field: private 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: 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.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(ネイティブメソッド)
    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

現在、 Jackson1MappingJacksonJsonViewで動作するように設計された を使用しています。

あなたは次のことを言及しています:

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 に答える