Java 将@Named托管bean注入另一个重用JSF页面?
我试图通过在另一个jsf页面中包含使用facelets来重用jsf页面,因为这个页面将被许多其他页面使用。但问题是,我无法将可用于此页面的托管bean的atributes os放入包含此页面的托管bean中 页面pessoa.xhtml中的一些重复代码和标题代码已被删除:Java 将@Named托管bean注入另一个重用JSF页面?,java,jsf-2,cdi,Java,Jsf 2,Cdi,我试图通过在另一个jsf页面中包含使用facelets来重用jsf页面,因为这个页面将被许多其他页面使用。但问题是,我无法将可用于此页面的托管bean的atributes os放入包含此页面的托管bean中 页面pessoa.xhtml中的一些重复代码和标题代码已被删除: <h:body> <div id="pessoa"> <h:form id="formPessoa"> <h:messages for=
<h:body>
<div id="pessoa">
<h:form id="formPessoa">
<h:messages for="formPessoa"/>
<h:panelGrid columns="3">
<h:outputLabel for="id" value="Código: " />
<h:inputText id="id" value="#{pessoaMB.pessoa.id}"/>
<h:message for="id" />
<h:outputLabel for="apelidoNomeFantasia" value="Apelido/Nome Fantasia: " />
<h:inputText id="apelidoNomeFantasia" value="#{pessoaMB.pessoa.apelidoNomeFantasia}"/>
<h:message for="apelidoNomeFantasia" />
<h:outputLabel for="rgIe" value="RG/Inscrição Estadual: " />
<h:inputText id="rgIe" value="#{pessoaMB.pessoa.rgIe}"/>
</h:panelGrid>
</h:form>
</div>
</h:body>
下面是包含pessoa.xhtml的其中一个页面的代码。
empresa.xhtml
<ui:composition template="/resources/template.xhtml">
<ui:define name="title">
<h:outputText value="Cadastro de Empresa"/>
</ui:define>
<ui:define name="content">
<h:form id="formEmpresa">
<ui:include src="/cadastro/pessoa/pessoa.xhtml" />
<h:commandButton id="novo" action="#{empresaMB.newEmpresa}" value="Novo" />
<h:commandButton id="salvar" action="#{empresaMB.insert}" value="Salvar" />
</h:form>
</ui:define>
</ui:composition>
我认为@InjectAnotion可以完成这项工作,但它没有。到底是什么问题?
EmpresaMB
实例变量在EmpresaMB
中是否保持空值?(即初始注入是否失败?)
或者问题是您认为执行new PessoaMB()
会对会话范围的实例产生任何影响
最后一个构造似乎没有意义。也就是说,CDI正在向EmpresaMB
实例注入PessoaMB
的实例。这正是会话中使用的实例。但是,当您在newEmpresa()
中创建一个新实例时,您只是在用另一个实例覆盖引用。这与会话范围内的版本没有任何关系
如果希望“主”bean生成插入其作用域的其他bean,则需要使用@Named@products注释对实例字段进行注释:
@Named
@SessionScoped
public class EmpresaMB implements Serializable {
@EJB
private EmpresaEJBRemote empresaEJB;
private Empresa empresa;
@Named
@Produces
private PessoaMB pessoaMB;
}
请参阅Reza Rahman的文章以了解有关此的其他详细信息:问题在于我无法恢复EmpresaMB中在pessoaMB中声明的对象pessoa。当我尝试获取这些值时,它会将null返回给pessoa的所有属性。此外,我将then的范围和then的范围都更改为@RequestScope,但pessoa的所有值都保持为null。pessoaMB中的构造函数是否导致了这种情况?在做一些其他测试时,我已经看到pessoaMB使用视图的值创建了一个Pessoab,但是当我@injectthePessoamb到EmpresaMB中时,我相信创建了一个新的pessoaMB实例,丢失了Pessoab属性的值(null)。@Inject不应该在上下文中注入pessoaMB?稍后我会做更多的测试。谢谢你的帮助。嘿,谢谢,@Named@products就是我需要的。很棒的文章。我还认为,
@Inject
将用于bean,为什么不呢?
@EJB
private EmpresaEJBRemote empresaEJB;
private Empresa empresa;
@Inject
private PessoaMB pessoaMB;
public String insert() {
pessoaMB = this.getPessoaMB();
empresa.setId(pessoaMB.getPessoa().getId());
empresaEJB.insert(empresa);
return "/cadastro/empresa/empresa";
}
public String newEmpresa() {
pessoaMB = new PessoaMB();
return "/cadastro/empresa/empresa";
}
//both empresa and pessoaMB getters and setters has been added to the code
}
@Named
@SessionScoped
public class EmpresaMB implements Serializable {
@EJB
private EmpresaEJBRemote empresaEJB;
private Empresa empresa;
@Named
@Produces
private PessoaMB pessoaMB;
}