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

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

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

相关文章:

java - 跳过 jsf 生命周期阶段

jsf - 通过预创建 FacesContext 在 Filter 中访问请求属性(在重定向之前在托管 bean 中设置)

java - 有 ASP.Net MVC 经验,如何学习 JSP/MVC?

java - OCPSoft 重写 - 响应已提交错误

c# - 通过属性或 setter 方法的 ASP.NET Core MVC 依赖注入(inject)

c++ - 访问实现接口(interface)但不属于接口(interface)的类的函数

c# - 确定 Neo4j 驱动程序和 session 对象的范围

azure - 在本地运行 Azure Functions 时使用 stub

java - 抽象类构造函数初始化

android - 数据绑定(bind) : How to use BaseActivity/How to use Abstraction