抽象和具体类中的依赖注入

时间:2013-01-20 23:36:09

标签: jsf dependency-injection abstract-class managed-bean

我使用JSF并且遇到问题很长一段时间,我在很多地方搜索过但却找不到合适的答案。

我是否可以在抽象(或更常见的是层次结构中较高的类)类中使用依赖注入? 另外,在使用继承时我们应该如何处理注释?我已经读过,通常的做法不是注释抽象类,只注意具体的抽象类,但是,这意味着不会注入抽象类吗?

我的问题是那个(查看最后的评论):

抽象类

@ManagedBean
@ViewScoped
public abstract class AbstractController<T extends VersionedObject> implements Serializable {
    @ManagedProperty("#{libraryVersionController}")
    private LibraryVersionController libraryVersionController;

public List<T> loadFromDatasource(IVersionedServiceBase<T> service) {
        log.info("Loading generic VO from data source");

        VersionedObjectFilter filter = new VersionedObjectFilter();
        filter.setSelectedLibVersion(libraryVersionController.getSelectedItem());
        // etc
    }
    // getters, setters...
}

具体类

@ManagedBean
@ViewScoped
public class DomainController extends AbstractController<Domain> implements Serializable {
private List<Domain> allItems;
   private Domain[] selectedItem;

   @ManagedProperty(value = "#{domainService}")
   private DomainService domainService;

   @PostConstruct
   public void loadFromDatasource() {
    allItems = super.loadFromDatasource(domainService);
        // !! DOES NOT WORK, null pointer exception on abstract class (libraryVersionController)
   // etc
}

正确设置了getter和setter,因为我可以在我的.xhml中读到它是我引用的具体类(#{domainController.allItems}),只有一个@PostConstruct。我使用的是JSF2.1和Mojarra。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

至于你的NullPointerException,我的猜测是缺少AbstractController.setLibraryVersionController。据我所知,当构造AbstractController时(可能它有一个隐式构造函数,即使它是抽象的),需要该方法来填充适当的值。

我知道你说所有的吸气剂和制定者都在那里,但这个似乎很棘手,所以你可能错过了它。如果向此方法添加日志记录,则可以检查JSF是否正在尝试填充该值,并检查该值是否为null。

关于依赖注入如何与继承层次结构一起工作的一般问题,我猜你的方法是正确的,并且依赖性是为基类注入的,然后是派生类,在链中注入。