2011-03-13 14 views
1

faceletsを別のjsfページに使用することでjsfページを再利用しようとしています。このページは他の多くのページで使用されるためです。しかし、問題は、このページを含むマネージドBeanに、このページのマネージドBeanリポジションの属性を取得できないことです。@ NamedマネージドBeanを別の再利用JSFページに挿入しますか?

ページ、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 が パブリッククラスEmpresaMBがシリアライズ{

@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 
} 

を実装@SessionScoped私は@Injectの注釈は、仕事をするだろうと思うが、それはしていません。

+0

私はまた 'Inject' @豆で使用されるだろうと思うだろう、なぜ? – Thufir

答えて

0

まさに問題は何ですか? pessoaMBインスタンス変数がEmpresaMBにnullのままですか? (すなわち、最初の注入が失敗するかどうか)

new PessoaMB()を実行すると、セッションスコープのインスタンスに何らかの影響があると思われる問題はありますか?

この最後の構築物は、意味をなすようには見えません。すなわち、CDIは、PessoaMBのインスタンスでEmpresaMBインスタンスを注入しています。これは、セッションで使用される正確なインスタンスです。しかし、newEmpresa()に新しいインスタンスを作成すると、参照を別のインスタンスで上書きするだけです。これは、セッションスコープのバージョンとは何の関係もありません。

あなたがその範囲に挿入されます他の豆を生産する「マスター」Beanをしたい場合、あなたは@Named @Producesのアノテーションでインスタンスフィールドに注釈を付ける必要がありますため

@Named 
@SessionScoped 
public class EmpresaMB implements Serializable { 

    @EJB 
    private EmpresaEJBRemote empresaEJB; 
    private Empresa empresa; 

    @Named 
    @Produces 
    private PessoaMB pessoaMB; 
} 

参照レザ・ラーマンの記事これについていくつかの追加の詳細:Dependency Injection in Java EE 6: Conversations (Part 4)

+0

問題は、EmpresaMB内のpessoaMBで宣言されているオブジェクトペソアを回復できないことです。値を取得しようとすると、pessoaのすべての属性にnullが返されます。 さらに、両方のスコープを@RequestScopeに変更しますが、pessoaのすべての値はnullのままです。 pessoaMBのコンストラクタがこれを引き起こしていますか?返信のThx。他のいくつかのテストをやって、私はpessoaMBは、ビューの値を持つペソアを作成しますが、私はEmpresaMBにPessoaMBを@Injectとき、私はpessoaMbの新しいインスタンスが作成されることを信じて、の属性の値を失うこと – viniciusme

+0

を見てきましたペソア(ヌル)。 @Injectはコンテキスト内にpessoaMBを挿入することは想定されていませんでしたか?後でもう少しテストをします。ヘルプのThx。 – viniciusme

+0

こんにちは、@Named @Producesは私が必要としていたものでした。素晴らしい記事。 – viniciusme

関連する問題