gpt4 book ai didi

jsf - 抽象类和具体类中的依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-02 05:03:04 24 4
gpt4 key购买 nike

我正在使用 JSF 并且在一段时间内遇到了问题,我在很多地方进行了搜索,但找不到任何合适的答案。

我可以让依赖注入(inject)在抽象类(或更一般地说是层次结构中更高的类)中工作吗?
另外,在使用继承时我们应该如何处理注释?我读过,通常的做法是不注释抽象类,只注释具体的类,但是,这意味着没有对该抽象类的注入(inject)?

我的问题是一个(检查最后一条评论):

抽象类

@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。

谢谢你的帮助 !

最佳答案

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

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

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

关于jsf - 抽象类和具体类中的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14430623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com