2011-03-13 2 views
1

facelets를 다른 jsf 페이지에 포함 시켜서 jsf 페이지를 재사용하려고합니다.이 페이지는 다른 많은 페이지에서 사용되기 때문에입니다. 하지만 문제는이 페이지를 포함하는 관리 빈에이 페이지에 대한 관리 빈을 배치 할 수 없다는 것입니다.@amed 관리 빈을 다른 재사용 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 여기

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

이 페이지 중 하나의 코드 PessoaMB

관리 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는 콩 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 
} 

내가 @Inject의 말뭉치 주석이 일을 할 것이라고 생각 구현 @SessionScoped하지만, 그렇지 않습니다.

+0

나는 또한'@ Inject'가 콩에서 사용될 것이라고 생각할 것이다. – Thufir

답변

0

정확히 무엇이 문제입니까? pessoaMB 인스턴스 변수가 EmpresaMB에 null로 유지됩니까? (즉, 초기 주입이 실패합니까?)

new PessoaMB()을 수행하면 세션 범위 인스턴스에 어떤 영향을 미칠 것이라고 생각합니까?

이 마지막 구성은 의미가없는 것처럼 보입니다. 즉, CDI는 PessoaMB의 인스턴스와 함께 EmpresaMB 인스턴스를 주입하고 있습니다. 이것은 세션에서 사용 된 정확한 인스턴스입니다. 그러나 newEmpresa()에 새 인스턴스를 만들면 참조를 다른 인스턴스로 간단히 덮어 쓰는 것입니다. 이것은 세션 범위 버전과 아무런 관련이 없습니다.

당신이 그 범위에 삽입됩니다 다른 콩을 생산하는 '마스터'콩을 원하는 경우에, 당신은 @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를 복구 할 수 없다는 것입니다. 값을 얻으려고하면 pessoa의 모든 속성에 null을 반환합니다. 게다가, 둘 다 @RequestScope에 대한 범위를 변경하지만, pessoa의 모든 값은 null로 유지됩니다. pessoaMB의 생성자가이 문제를 일으키고 있습니까? 답장을위한 Thx. – viniciusme

+0

다른 테스트를하고 있는데, pessoaMB가 뷰의 값으로 pessoa를 생성하는 것을 보았습니다.하지만 PessoaMB를 EmpresaMB에 삽입하면 pessoaMb의 새 인스턴스가 생성되어 pessoa (null). @Inject는 pessoaMB를 컨텍스트에 삽입하지 않아도됩니까? 나중에 나는 더 많은 테스트를 할 것입니다. Thx는 도움을 요청합니다. – viniciusme

+0

안녕하세요, @Named @Produces는 내가 필요로하는 것입니다. 훌륭한 기사. – viniciusme

관련 문제