【发布时间】:2013-01-20 23:36:08
【问题描述】:
我正在使用 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。
感谢您的帮助!
【问题讨论】:
-
JSF DI 不考虑抽象实现。见this answer
-
@kolossus 很可惜,好像差距很大。有没有办法用具体的超类而不是抽象的超类来做到这一点?
-
@kolossus:该问题/答案涉及不同的问题。该问题的 OP 只是询问是否可以从具体类中省略
@ManagedBean和@XxxScope并使用在抽象类上声明的那些。这确实是不可能的。但是当前的问题根本不是关于这个的(尽管AbstractController上的@ManagedBean @ViewScoped完全是多余的,因为无论如何它们都会被忽略)。 -
Qualaelay:什么 Mojarra 版本?这对我来说在 2.1.17 上效果很好。请注意,将 JSF 托管 bean 用作服务类有点奇怪。有人会为此使用 EJB。在发布答案之前,我想看看您如何将
LibraryVersionController声明为托管 bean。您的问题表明它根本不是托管 bean,因此在 EL 范围内找不到。 -
抱歉延迟回复,个人问题需要解决:/ 无论如何@BalusC 你的提示很好,因为
LibraryVersionController有问题(它是@Component和@ManagedBean),它有效当我删除@Component时很好(所以我的类和超类现在都被注释为托管bean,注入在每个中都可以正常工作)。将 ManagedBean 作为服务的原因是服务类是 Spring+JPA,所以我认为这是要走的路,但如果这不是一个好方法,请不要犹豫。
标签: jsf dependency-injection abstract-class managed-bean