Java Spring 4 和 Rest WS 集成

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/23631868/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-14 00:25:43  来源:igfitidea点击:

Spring 4 and Rest WS integration

javajsonspringrestspring-4

提问by suvojit

I have been doing a poc on Spring4 and RestWS integration. I am new to both with barely a weeks exposure. I am following instructions from blogs. I understand that in Spring 4 and restWS setup Hymanson-core/anotation/databind 2 is to be used for correct message converstion of JSON <-> Java object to happen. Also org.springframework.http.converter.json.MappingHymanson2HttpMessageConverteris to be used for message conversion. I satisfied all these requirements. However when I try to start application, I get bean create exception. stack

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

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'regionController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.web.servlet.View com.leggmason.lmpamfs.controllers.RegionController.jsonView_i; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.view.json.MappingHymansonJsonView#0' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.web.servlet.view.json.MappingHymansonJsonView]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/codehaus/Hymanson/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.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)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.web.servlet.View com.leggmason.lmpamfs.controllers.RegionController.jsonView_i; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.view.json.MappingHymansonJsonView#0' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.web.servlet.view.json.MappingHymansonJsonView]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/codehaus/Hymanson/map/ObjectMapper
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
    ... 22 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.view.json.MappingHymansonJsonView#0' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.web.servlet.view.json.MappingHymansonJsonView]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/codehaus/Hymanson/map/ObjectMapper
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1076)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1021)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory.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.findAutowireCandidates(DefaultListableBeanFactory.java:1017)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
    ... 24 more
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.web.servlet.view.json.MappingHymansonJsonView]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/codehaus/Hymanson/map/ObjectMapper
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:164)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1069)
    ... 35 more
Caused by: java.lang.NoClassDefFoundError: org/codehaus/Hymanson/map/ObjectMapper
    at org.springframework.web.servlet.view.json.MappingHymansonJsonView.(MappingHymansonJsonView.java:65)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
    ... 37 more
Caused by: java.lang.ClassNotFoundException: org.codehaus.Hymanson.map.ObjectMapper
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
    ... 43 more

It seems that something is wrong with MappingHymansonJsonViewclass. Could following from factory file be the cause of trouble ?

MappingHymansonJsonView类似乎有问题。来自工厂文件的以下可能是问题的原因吗?

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

Am I supposed to replace this class as well? I will help assistance to fix this.

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

Thanks, Suvojit

谢谢,苏沃吉特

采纳答案by M. Deinum

You are currently using the MappingHymansonJsonViewwhich is designed to work with Hymanson1 .

您目前正在使用MappingHymansonJsonView旨在与Hymanson1 一起使用的

You mention the following:

你提到了以下几点:

I am not using Hymanson 1 api's. jars in my lib are, Hymanson-core-2.0.2, Hymanson-annotation-2.3.0, Hymanson-bindings 2.3.0.

我没有使用 Hymanson 1 api。我的库中的罐子是 Hymanson-core-2.0.2、Hymanson-annotation-2.3.0、Hymanson-bindings 2.3.0。

Which means you have Hymanson2on your classpath. Hymanson1 and Hymanson2 aren't compatible (different packages, different classes etc.).

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

You have 2 possible solutions

您有 2 种可能的解决方案

  1. Don't use Hymanson2and switch your dependencies to Hymanson1
  2. Replace the MappingHymansonJsonViewwith the MappingHymanson2JsonView
  1. 不要使用Hymanson2并将您的依赖项切换到Hymanson1
  2. 替换MappingHymansonJsonViewMappingHymanson2JsonView

回答by Haim Raman

For Spring4 Rest + Json POC The following App Context is enough

对于 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>

Make sure you have dependency for Hymanson (e.g. in maven)

确保您对 Hymanson 有依赖性(例如在 maven 中)

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

You do not specifically need to define MappingHymanson2JsonView; MappingHymanson2HttpMessageConverter/MappingHymansonHttpMessageConverter will be created automatically when Hymanson is the the class path (the default is only when ContentType/Accept are application/json).

您不需要特别定义 MappingHymanson2JsonView;MappingHymanson2HttpMessageConverter/MappingHymansonHttpMessageConverter 会在Hymanson为类路径时自动创建(默认仅当ContentType/Accept为application/json时)。

Hymanson1 is deprecated, but still supported if from any reason you are limited to Hymanson1 See Spring 4 docs

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