在Spring中使用抽象类作为实例变量

时间:2014-11-17 19:25:00

标签: java spring struts

我的问题是我有一个Spring模型

@Entity
public class PetOwner {
    @ManyToOne
    @JoinColumn(name = "pet_id", nullable = true)
    private Pet pet;

Pet是一个抽象类,有2个子类Dog和Cat。

@Entity
@Inheritance(strategy= InheritanceType.JOINED)
public abstract class Pet {
    @OneToMany(fetch = FetchType.LAZY)
    protected Set<PetOwner> owners;
}

@Entity
public class Cat extends Pet 

@Entity
public class Dog extends Pet 

当我以Struts形式创建一个新的PetOwner并尝试将其宠物绑定到Dog或Cat对象时,我在提交表单时出错:

Error creating bean with name 'de.model.Pet': Instantiation of bean failed; 
nested exception is org.springframework.beans.BeanInstantiationException: 
Could not instantiate bean class [de.model.Pet]: Is it an abstract class?; 
nested exception is java.lang.InstantiationException

如何告诉Spring根据类pet-object初始化de.model.Dog或de.model.Cat?

仅供参考:我有PetDAO和PetService,但我不确定它们是否会影响这个问题。

我感谢你的每一次帮助!

1 个答案:

答案 0 :(得分:1)

就我个人而言,我会将Pet变为Interface并让CatDog实施它以避免此类问题。对不起话题感到抱歉!

无论如何,如果您希望动态初始化/填充您的类的某个成员,请尝试查找方法注入。阅读第3.3.4.1页here

如果包含动态成员的类是在scope = singletone(spring bean容器的默认值)中创建的,那么每次访问分配了查找方法的字段时,您将根据业务逻辑获得适当的对象在查找方法中实现。

另外,我在Spring文档中发现了这个example - 我认为非常清楚。看看&#34; 3.4.6.1 Lookup方法注入&#34;

当您配置PetOwner类为其Pet成员分配查找方法时 - 只要您需要Pet bean的新实例,就会调用它。

祝你好运!