Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.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
Jakarta ee CDI@RequestScoped bean生命周期_Jakarta Ee_Cdi - Fatal编程技术网

Jakarta ee CDI@RequestScoped bean生命周期

Jakarta ee CDI@RequestScoped bean生命周期,jakarta-ee,cdi,Jakarta Ee,Cdi,我使用CDI注释定义了一个RequestScoped bean,如下所示。我有几个页面使用同一个bean。当我从一页导航到另一页时。bean obj保持不变。即使我更改了会话(使用不同的用户登录)。bean对象没有改变 根据RequestScope定义,bean实例应该为每个新请求重新创建。我错过了什么 我正在使用JSF/Primefaces。导航到detail.xhtml页面后,可以看到create.xhtml页面中输入的值。在backingbean中,不会重新分配该值 谢谢 张 ======

我使用CDI注释定义了一个RequestScoped bean,如下所示。我有几个页面使用同一个bean。当我从一页导航到另一页时。bean obj保持不变。即使我更改了会话(使用不同的用户登录)。bean对象没有改变

根据RequestScope定义,bean实例应该为每个新请求重新创建。我错过了什么

我正在使用JSF/Primefaces。导航到detail.xhtml页面后,可以看到create.xhtml页面中输入的值。在backingbean中,不会重新分配该值

谢谢

============================================================

import javax.enterprise.context.requestscope

import javax.inject.Named

@Named(“targetManager”)

@RequestScoped

公共类TargetManager实现可序列化{
}

=================================================

create.xhtml:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui" 
xmlns:f="http://java.sun.com/jsf/core" 
      template="../../templates/rapm.xhtml">

<ui:define name="contents">

<h:form id="createform">
  <h:outputLabel id="englishNameLabel">
     <h:outputText id="englishName" value="#{msg['view.label.englishname']}:" />
     <h:outputText id="englishNameStar" value="* " styleClass="mandatory" />
  </h:outputLabel>  
  <p:inputText id="englishTitle" value="#{targetManager.selectedTarget.englishName}" >
    <f:validator id="englishNameValidate1" validatorId="duplicateValidator" />
  </p:inputText>`
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:p="http://primefaces.org/ui"
  xmlns:f="http://java.sun.com/jsf/core"
  template="../../templates/rapm.xhtml">

  <ui:define name="contents">

  <p:scrollPanel id="scrollPanel" styleClass="contentPanel ntb" mode="native">

     <h:outputText id="englishName" value="#{msg['.view.label.englishname']}:"/>
       <h:outputText id="englishNameValue" value="#{targetManager.selectedTarget.englishName}" />

`

您可以通过输出创建时间来检查它是否已重新创建。您将看到它每次输出不同的时间,这意味着它会在每个请求中重新创建

import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
@Named("targetInstructionManager")
@RequestScoped
public class TargetInstructionManager implements Serializable { 
    public TargetInstructionManager (){
            System.out.println(System.currentTimeMillis());
        }
}

CDI确实会为每个请求创建一个新对象,但不会为您的servlet或您正在使用的内容创建一个新对象


假设您有一个servlet,那么servlet实例只创建一次,如果您将请求范围的bean注入这个servlet,那么CDI将无法在servlet内交换bean实例,因为这可能会导致不可预测的状态。因此,CDI为servlet创建一个代理实例,该实例在servlet存在的所有时间都保持不变。这就是为什么您只获取bean实例的这个单一id,您正在检索CDI代理对象的id,而不是底层bean的id。当一个新的请求传入时,CDI创建一个新的bean实例,并用这个bean为这个特定的请求支持代理。

你怎么知道对象没有更改?我调试代码。对象id始终相同。bean的值可以从多个页面访问。请发布调试代码的部分。不知道如何发布调试代码。我只是在我的审计程序上设置了一个检查点,它捕获bean“targetManager”的一些值。在这一点上,当线程来自不同的页面和请求时,bean的id总是相同的数字。数字id只有在重新启动应用程序后才会更改–Xunan Zhang 5小时前我有一个
@PostConstruct public void init(){}
,我还将您的构造函数放入了类中。只有在部署时才调用这两个函数。当应用程序启动后,它将不再被调用。你的解释是合理的。有一点尚不清楚:根据代理解释,代理中的值应该为每个新bean(请求)更改。但是为什么一个页面的bean属性值(带有EL)输入可以在另一个页面中看到,而无需重新分配?谢谢你能发布更多关于你的设置的细节吗?豆子,页面。。。肯定还有其他东西有另一个作用域。最好是你能和我们共享一个显示这种行为的最小项目。谢谢你的2个简化页面。不确定设置、web.xml和faces-config.xml是否涉及范围。其他部分很复杂。似乎不涉及,但前几行是目标管理器的定义。它包含一个模型实例“selectedTarget”。该模型具有“englishName”属性。我希望“englishName”的值可以根据不同的请求进行更改