Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将@Named托管bean注入另一个重用JSF页面?_Java_Jsf 2_Cdi - Fatal编程技术网

Java 将@Named托管bean注入另一个重用JSF页面?

Java 将@Named托管bean注入另一个重用JSF页面?,java,jsf-2,cdi,Java,Jsf 2,Cdi,我试图通过在另一个jsf页面中包含使用facelets来重用jsf页面,因为这个页面将被许多其他页面使用。但问题是,我无法将可用于此页面的托管bean的atributes os放入包含此页面的托管bean中 页面pessoa.xhtml中的一些重复代码和标题代码已被删除: <h:body> <div id="pessoa"> <h:form id="formPessoa"> <h:messages for=

我试图通过在另一个jsf页面中包含使用facelets来重用jsf页面,因为这个页面将被许多其他页面使用。但问题是,我无法将可用于此页面的托管bean的atributes os放入包含此页面的托管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>
下面是包含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>

我认为@InjectAnotion可以完成这项工作,但它没有。

到底是什么问题?
EmpresaMB
实例变量在
EmpresaMB
中是否保持空值?(即初始注入是否失败?)

或者问题是您认为执行
new PessoaMB()
会对会话范围的实例产生任何影响

最后一个构造似乎没有意义。也就是说,CDI正在向
EmpresaMB
实例注入
PessoaMB
的实例。这正是会话中使用的实例。但是,当您在
newEmpresa()
中创建一个新实例时,您只是在用另一个实例覆盖引用。这与会话范围内的版本没有任何关系

如果希望“主”bean生成插入其作用域的其他bean,则需要使用@Named@products注释对实例字段进行注释:

@Named 
@SessionScoped 
public class EmpresaMB implements Serializable {

   @EJB
   private EmpresaEJBRemote empresaEJB;
   private Empresa empresa;

   @Named 
   @Produces
   private PessoaMB pessoaMB;
}

请参阅Reza Rahman的文章以了解有关此的其他详细信息:

问题在于我无法恢复EmpresaMB中在pessoaMB中声明的对象pessoa。当我尝试获取这些值时,它会将null返回给pessoa的所有属性。此外,我将then的范围和then的范围都更改为@RequestScope,但pessoa的所有值都保持为null。pessoaMB中的构造函数是否导致了这种情况?在做一些其他测试时,我已经看到pessoaMB使用视图的值创建了一个Pessoab,但是当我@injectthePessoamb到EmpresaMB中时,我相信创建了一个新的pessoaMB实例,丢失了Pessoab属性的值(null)。@Inject不应该在上下文中注入pessoaMB?稍后我会做更多的测试。谢谢你的帮助。嘿,谢谢,@Named@products就是我需要的。很棒的文章。我还认为,
@Inject
将用于bean,为什么不呢?
@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
}
@Named 
@SessionScoped 
public class EmpresaMB implements Serializable {

   @EJB
   private EmpresaEJBRemote empresaEJB;
   private Empresa empresa;

   @Named 
   @Produces
   private PessoaMB pessoaMB;
}