Внедрить управляемый бин @Named в другую страницу повторного использования JSF? - PullRequest
1 голос
/ 13 марта 2011

Я пытаюсь повторно использовать страницу 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.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 @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
}

Я думаю, что @Внедрение аннотации сделает эту работу, но это не так.

1 Ответ

0 голосов
/ 13 марта 2011

В чем именно проблема?Останется ли переменная экземпляра pessoaMB нулевой в EmpresaMB?(т.е. происходит ли первоначальное внедрение?)

Или проблема в том, что выполнение new PessoaMB() окажет какое-либо влияние на экземпляр области сеанса?

Эта последняя конструкция не имеет смысла.А именно, CDI внедряет экземпляр EmpresaMB с экземпляром PessoaMB.Это точный экземпляр, используемый в сеансе.Однако, когда вы создаете новый экземпляр в newEmpresa(), вы просто перезаписываете ссылку другим экземпляром.Это никак не связано с версией области действия сеанса.

Если вы хотите, чтобы основной компонент генерировал другие компоненты, которые вставляются в его область действия, вам нужно аннотировать поле экземпляра аннотациями @Named @Produces:

@Named 
@SessionScoped 
public class EmpresaMB implements Serializable {

   @EJB
   private EmpresaEJBRemote empresaEJB;
   private Empresa empresa;

   @Named 
   @Produces
   private PessoaMB pessoaMB;
}

Дополнительные сведения об этом см. В статье Резы Рахмана: Внедрение зависимостей в Java EE 6: разговоры (часть 4)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...