bean的初始化失败; ConversionNotSupportedException

时间:2015-11-03 14:06:52

标签: java spring dependency-injection

我有一个更高层次的上下文,在服务器启动时(tomcat)获取以下bean:

<bean id="org.sakaiproject.rubrics.api.rubric.RubricsService" class="org.sakaiproject.rubrics.impl.RubricsServiceImpl"
    init-method="init"
    singleton="true">
    <property name="rubricsLogic"   ref="org.sakaiproject.rubrics.logic.RURubricLogic" />
    <property name="externalLogic"  ref="org.sakaiproject.rubrics.api.rubric.ExternalLogic" />
</bean>

那个bean的类('RubricsServiceImpl')实现了一个名为RubricsService的API接口......到目前为止一直很好。这初始化OK。

在层次结构中,当部署webapps时,在applicationContext.xml中对这些bean进行引用:

<bean id="org.sakaiproject.rubrics.tool.RubricsTool" class="org.sakaiproject.rubrics.tool.RubricsTool">
    <property name="rubricsService" ref="org.sakaiproject.rubrics.api.rubric.RubricsService" />
</bean>

在部署应用程序时,会抛出以下异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.sakaiproject.rubrics.tool.RubricsTool' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: 
Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'org.sakaiproject.rubrics.impl.RubricsServiceImpl' to required type 'org.sakaiproject.rubrics.api.rubric.RubricsService' for property 'rubricsService'; nested exception is java.lang.IllegalStateException: 
Cannot convert value of type [org.sakaiproject.rubrics.impl.RubricsServiceImpl] to required type [org.sakaiproject.rubrics.api.rubric.RubricsService] for property 'rubricsService': 
no matching editors or conversion strategy found

所有poms都包含它们所属的所有依赖项,因此没有任何包来自定义或任何东西。我很无能。

这可能是类加载器问题吗?

以下是我的申请结构:

enter image description here

1 个答案:

答案 0 :(得分:0)

好的......这是一个类加载器问题。 webapp的类加载器与容器级别的一个碰撞,因此无法进行转换。

所有API .jars都部署到tomcat的shared / lib目录,以便所有应用程序能够访问它们。这可以通过设置API模块(webapp)的pom来完成:

var list = new List<SqlParameter>();
list.Add(new SqlParameter ( "@PROC_TYPE", "DISPLAY" ));

var param = list.ToArray();

现在,基于上面webapp的层次结构,rubrics有一个用于webapp的基础pom.xml,在这里,有必要定义属性,以便其模块的所有子poms共享这些依赖项。通过webapp的基本pom.xml中的markind进行以下操作:

<properties>
    <deploy.target>shared</deploy.target>
</properties>

然后,我们只需设置依赖项,如果我们需要它,没有为该类加载器定义.jar,但稍后将由容器提供。

这是我解决问题后的解释。请随意纠正/添加/充实。