'bean的实例化失败;这是一个抽象的课吗?尝试使用抽象父实例化bean时

时间:2015-06-03 16:08:41

标签: java spring spring-mvc hybris

我正在尝试通过继承父bean(它是抽象的)在Spring上下文中实例化一个没有类定义的bean。像这样:

<bean id="childBean" parent="abstractBean">
    ...
</bean>

<bean id="abstractBean" class="com.java.bean.AbstractBeanClass" 
        abstract="true" />

但是Spring给了我以下错误消息:

Error creating bean with name 'childBean' defined in class path resource 
    [project-spring.xml]: 
Instantiation of bean failed; nested exception is 
    org.springframework.beans.BeanInstantiationException: 
Could not instantiate bean class [com.java.bean.AbstractBeanClass]: 
Is it an abstract class?;
nested exception is java.lang.InstantiationException
...

我记得在另一个项目中有这个,它完美无缺。
我记得在同一个项目中有这个,它完美无缺。

我在这里缺少什么?

更新1 发现另一个豆子被抽出的方式与我提到的完全一样:

<bean id="variantOptionDataConverter" parent="abstractPopulatingConverter">
    ...
</bean>

更新2
抽象类声明:

public abstract class AbstractBeanClass<SOURCE, TARGET>
        extends AbstractConverter<SOURCE, TARGET>
        implements PopulatorList<SOURCE, TARGET>
{
...
}

注意:还有其他类可以扩展此类。我上面提到的“其他有效的春豆”都没有扩展到这个类。

注意2:我知道这很奇怪,并且,根据Java基础知识,它应该不起作用(就像所有人都提到的那样)。但是,我不知道如何将其他Spring bean放在上下文中。我试图将“其他有效的春豆”复制到我的代码中,更改一些重复的名称,并且它有效。而且,这就是我想要理解的......

4 个答案:

答案 0 :(得分:2)

Juliano所指的这个具体例子来自hybris商务套件。 Hybris具有相互依赖的扩展概念。每个扩展都定义了自己的应用程序上下文,可以访问其继承的应用程序上下文(来自那些被声明为依赖项的扩展)。

在此示例中,在根应用程序上下文中声明了一个abstractPopulatingConverter bean声明,其声明的java类是abstract。 但是,在依赖树下面的其他应用程序上下文中,有一个别名定义,用于此#34; abstractPopulatingConverter&#34;指向具有类的bean定义。 这就是为什么在很多情况下(即在依赖树之下的那些情况下)使用parent =&#34; abstractPopulatingConverter&#34;因为它指向由别名定义的新bean。

答案 1 :(得分:0)

当Spring容器面对absatract Java类(不是抽象bean)时,这是非常常见的消息。检查你的com.java.bean.AbstractBeanClass代码,你可能会找到&#34; public abstract class&#34;。

答案 2 :(得分:0)

  

我在这里缺少什么?

我不知道你的其他项目中发生了什么,但Spring无法为abstract的类实例化bean。

关于abstract bean,Spring documentation个州

  

子bean定义从父定义继承配置数据。

     

[...]

     

子bean定义使用父定义中的bean类   如果没有指定,但也可以覆盖它。在后一种情况下,   子bean类必须与父类兼容,即它   必须接受父母的财产价值。

换句话说,用abstract="true"声明的bean定义只是用作其他bean的模板。

Java不允许abstract类的实例化。 Spring不能否决这种语言功能。 Spring无法实例化abstract类类型的bean。

答案 3 :(得分:-1)

找到答案:

确实,就像Sotirios Delimanolis评论一样,&#34;你必须有其他东西在进行,代理某种类型的可能&#34; ,Spring有一个代理实例化这种类型的bean声明,但它不能在没有方法的情况下实例化bean(它们只是在抽象类中声明,未实现)。
所以你必须实施&#34;这些方法,如下:

<bean id="childBean" parent="abstractBean">
   <lookup-method name="notImplementedMethod" bean="anotherBean"/>
</bean>

anotherBean 必须与 notImplementedMethod 的类型相同。