Внедрение управляемого компонента @Named в другую повторно используемую страницу JSF?

Я пытаюсь повторно использовать страницу jsf, включив использование лицевых панелей в другую страницу jsf, поскольку эта страница будет использоваться многими другими страницами. Но проблема в том, что я не могу получить атрибуты управляемого bean-компонента reposible для этой страницы в управляемые 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
}

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


person viniciusme    schedule 13.03.2011    source источник
comment
Я также думаю, что @Inject будет использоваться в bean-компоненте, почему бы и нет?   -  person Thufir    schedule 12.04.2012


Ответы (1)


В чем именно проблема? Остается ли переменная экземпляра 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)

person Arjan Tijms    schedule 13.03.2011
comment
Проблема в том, что я не могу восстановить pessoa объекта, который объявлен в pessoaMB внутри EmpresaMB. Когда я пытаюсь получить значения, он возвращает значение null для всех атрибутов pessoa. Кроме того, я меняю область действия обоих на @RequestScope, но все значения pessoa остаются нулевыми. Является ли это причиной конструктора в pessoaMB? Спасибо за ответ. - person viniciusme; 14.03.2011
comment
Выполняя некоторые другие тесты, я видел, что pessoaMB создает pessoaMB со значениями представления, но когда я @Inject PessoaMB в EmpresaMB, я считаю, что создается новый экземпляр pessoaMb, теряя значения атрибутов pessoa (нулевой). @Inject не должен был вводить pessoaMB в контексте? Позже я сделаю еще несколько тестов. Спасибо за помощь. - person viniciusme; 14.03.2011
comment
Эй, спасибо, @Named @Produces — это то, что мне было нужно. Отличная статья. - person viniciusme; 15.03.2011