Spring 4和Rest WS集成

10

我一直在进行Spring4和RestWS集成的POC。我对两者都很新,并且只接触了几个星期。我正在按照博客中的指示操作。我了解到,在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:无法自动装配字段:private org.springframework.web.servlet.View com.leggmason.lmpamfs.controllers.RegionController.jsonView_i;嵌套异常为org.springframework.beans.factory.BeanCreationException:创建名为“org.springframework.web.servlet.view.json.MappingJacksonJsonView#0”的bean时出错,它被定义 在ServletContext资源[/WEB-INF/applicationContext.xml]中:实例化bean失败;嵌套异常为org.springframework.beans.BeanInstantiationException:无法实例化bean类[org.springframework.web.servlet.view.json.MappingJacksonJsonView]:构造函数抛出异常;嵌套异常为java.lang.NoClassDefFoundError:org/codehaus/jackson/map/ObjectMapper
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4961)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5455)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
原因是:org.springframework.web.servlet.view.json.MappingJacksonJsonView类出现了问题。可能是工厂文件中以下内容引起的麻烦?
 <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">  
       <property name="contentType" value="text/plain"/>  
  </bean>  

我需要替换这个类吗? 我会帮助你修复这个问题。

谢谢, Suvojit


对不起,我不了解SpringBoot。就像我说的,我是个新手。我只是跟着网上的教程入门的。 - suvojit
啊,我注意到你正在使用旧的(Jackson 1)映射器类,所以可能是因为版本不匹配。 - chrylis -cautiouslyoptimistic-
@M.Deinum:正如我所提到的,我的类路径中没有jackson 1.x api jars。您能否详细说明您提出的修复方法。我的知识来源是: http://xpadro.blogspot.com/2014/01/migrating-spring-mvc-restful-web.html 和 http://www.programming-free.com/2014/03/spring-mvc-40-restful-web-service-json.html - suvojit
2
请查看我的评论。您正在使用MappingJacksonJsonView的jackson1类,但应该使用MappingJackson2JsonView - M. Deinum
@M.Deinum: 我误解了你的建议,但它对我很有效。非常感谢你。 - suvojit
显示剩余6条评论
2个回答

25

您目前正在使用的是 MappingJacksonJsonView,它的设计是与 Jackson1 一起使用的。

您提到了以下信息:

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

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

你有两种可能的解决方案

  1. 不使用 Jackson2,并将您的依赖项切换到 Jackson1
  2. MappingJackson2JsonView 替换 MappingJacksonJsonView

谢谢您的回答,我已经更新了XML文件,使用了org.springframework.http.converter.json.MappingJackson2HttpMessageConverter,但是在动态输出控制器中忽略了使用org.springframework.web.servlet.view.json.MappingJackson2JsonView。 - ledlogic

1

对于 Spring4 Rest + Json POC,以下应用程序上下文就足够了

<?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;当jackson在类路径中时,MappingJackson2HttpMessageConverter/MappingJacksonHttpMessageConverter将自动创建(默认情况下仅在ContentType/Accept为application/json时)。
Jackson1已被弃用,但如果由于任何原因限制了使用Jackson1,则仍得到支持。请参阅Spring 4文档

请查看:http://xpadro.blogspot.com/2014/01/migrating-spring-mvc-restful-web.html 它说jackson 2.x应该与Spring 4一起使用。 你是否已经使用Jackson 1.x和Spring4运行了你的poc应用程序? - suvojit
如果我想让它对所有请求都使用JSON解析器,而不仅仅是application/json,那我该怎么办? - Vihung
您可以通过<mvc:annotation-driven />设置supportedMediaTypes来自定义配置。 请参阅http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/converter/AbstractHttpMessageConverter.html#setSupportedMediaTypes-java.util.List- http://docs.spring.io/autorepo/docs/spring/3.2.x/spring-framework-reference/html/mvc.html - Haim Raman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接