1

我试图通过在另一个 jsf 页面中包含使用 facelets 来重用 jsf 页面,因为该页面将被许多其他页面使用。但问题是我无法将可用于此页面的托管 bean 的属性获取到包含此页面的托管 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 的页面之一的代码。企业版.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 注释可以完成这项工作,但事实并非如此。

4

1 回答 1

0

究竟是什么问题?pessoaMB实例变量是否保持为空EmpresaMB?(即初始注入是否失败?)

还是您认为这样做new PessoaMB()会对会话范围的实例产生任何影响的问题?

最后一个构造似乎没有意义。即,CDI 正在向EmpresaMB实例注入PessoaMB. 这是会话中使用的确切实例。但是,当您在其中创建新实例时,newEmpresa()您只是用另一个实例覆盖引用。这与会话范围的版本没有任何关系。

如果您希望“主”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 的文章:Java EE 6 中的依赖注入:对话(第 4 部分)

于 2011-03-13T14:53:02.493 回答