我正在尝试通过将facelets用于另一个jsf页面来重用jsf页面,因为这个页面将被许多其他页面使用。但问题是我无法将此页面的托管bean重定位的atributes os包含到包含此页面的托管bean中。
页面,pessoa.xhtml,一些重复和标题代码已被删除:
<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>
@Named管理的PessoaMB
@Named
@SessionScoped
public class PessoaMB implements Serializable {
private Pessoa pessoa;
public PessoaMB() {
this.pessoa = new Pessoa();
} //fim do construtor
public Pessoa getPessoa() {
return pessoa;
}
public void setPessoa(Pessoa pessoa) {
this.pessoa = pessoa;
}
}
以下是包含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>
@Named托管bean EmpresaMB。
@Named @SessionScoped 公共类EmpresaMB实现Serializable {
@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
}
我认为@Inject anotation会完成这项工作,但事实并非如此。
答案 0 :(得分:0)
究竟是什么问题? pessoaMB
实例变量在EmpresaMB
中是否仍为空? (即初始注射失败了吗?)
或者您认为执行new PessoaMB()
会对会话作用域实例产生任何影响的问题是什么?
这最后的结构似乎没有意义。也就是说,CDI正在为EmpresaMB
实例注入PessoaMB
的实例。这是会话中使用的确切实例。但是,当您在newEmpresa()
中创建新实例时,您只需使用其他实例覆盖该引用。这与会话作用域版本没有任何关系。
如果您希望'master'bean生成其范围内插入的其他bean,则需要使用@Named @Produces注释注释实例字段:
@Named
@SessionScoped
public class EmpresaMB implements Serializable {
@EJB
private EmpresaEJBRemote empresaEJB;
private Empresa empresa;
@Named
@Produces
private PessoaMB pessoaMB;
}
有关此问题的一些其他详细信息,请参阅Reza Rahman的文章:Dependency Injection in Java EE 6: Conversations (Part 4)