1

このページは他の多くのページで使用されるため、別のjsfページにファセットを使用して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を含むページの1つのコードです。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マネージドBeanEmpresaMB。

@Named @SessionScoped publicclassEmpresaMBは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インスタンス変数はでnullのまま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の記事を参照してください:Java EE 6での依存性注入:会話(パート4)

于 2011-03-13T14:53:02.493 に答える