4

我正在使用 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。

谢谢你的帮助 !

4

1 回答 1

0

至于您的 NullPointerException,我的猜测是 AbstractController.setLibraryVersionController 丢失了。据我了解,在构造 AbstractController 时(假设它具有隐式构造函数,即使它是抽象的),需要该方法来填充适当的值。

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

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

于 2013-01-21T00:21:09.010 回答