我使用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。
感谢您的帮助!
答案 0 :(得分:0)
至于你的NullPointerException,我的猜测是缺少AbstractController.setLibraryVersionController。据我所知,当构造AbstractController时(可能它有一个隐式构造函数,即使它是抽象的),需要该方法来填充适当的值。
我知道你说所有的吸气剂和制定者都在那里,但这个似乎很棘手,所以你可能错过了它。如果向此方法添加日志记录,则可以检查JSF是否正在尝试填充该值,并检查该值是否为null。
关于依赖注入如何与继承层次结构一起工作的一般问题,我猜你的方法是正确的,并且依赖性是为基类注入的,然后是派生类,在链中注入。