我可以在JSF视图中使用抽象类作为CDI托管bean吗?我想在派生类中使用set或override属性,并在父抽象类的JSF页面中使用它。派生视图以设置上下文,模板父视图必须显示为所有子项的公共部分。 我听说我可以在JSF视图中使用带有@Named注释的抽象类,但是我得到了错误
目标无法访问,标识符' viewModel'解析为null
如果我将抽象类更改为典型类,那么它的工作。可能在JSF视图中使用抽象类是不可能的?
ViewModel.java
@Named
@ConversationScoped
@Inherited
@Documented
@Stereotype
@Target({ TYPE })
@Retention(RUNTIME)
public abstract class ViewModel {
private String foo;
public void setFoo(String foo) {
this.foo = foo;
}
public String getFoo() {
return foo;
}
abstract void bar();
}
DerivedViewModel.java
@Named
@ConversationScoped
@Inherited
@Documented
@Stereotype
@Target({ TYPE })
@Retention(RUNTIME)
public class DerivedViewModel extends ViewModel {
public void init() {
this.setFoo("Foo");
}
@Override
void bar() {;}
}
View.xhtml
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:fn="http://xmlns.jcp.org/jsp/jstl/functions" xmlns:pt="http://xmlns.jcp.org/jsf/passthrough"
xmlns:p="http://primefaces.org/ui" xmlns:pe="http://primefaces.org/ui/extensions"
xmlns:sys="http://argustelecom.ru/system" xmlns:o="http://omnifaces.org/ui">
<ui:param name="viewModel" value="#{viewModel}" />
<ui:define name="body">
<h:outputText value="#{viewModel.foo}" />
<ui:insert name="derived" />
</ui:define>
</ui:composition>
DerivedView.xhtml
<ui:composition template="View.xhtml" xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:fn="http://xmlns.jcp.org/jsp/jstl/functions" xmlns:pt="http://xmlns.jcp.org/jsf/passthrough"
xmlns:p="http://primefaces.org/ui" xmlns:pe="http://primefaces.org/ui/extensions"
xmlns:sys="http://argustelecom.ru/system" xmlns:o="http://omnifaces.org/ui">
<ui:param name="viewModel" value="#{derivedViewModel}" />
<ui:define name="metadata">
<f:metadata>
<f:viewAction action="#{derivedViewModel.init()}"/>
</f:metadata>
</ui:define>
<ui:define name="derived">
blablabla
</ui:define>
</ui:composition>
答案 0 :(得分:2)
忘记EL或JSF。考虑OO。你能打这个电话吗。
viewModel.foo
答案是否定的,因为它是abstract
而viewModel
不能作为abstract
类ViewModel
的实例存在。出于同样的原因,你不能在EL中使用它。