我使用CDI注释定义了一个RequestScoped bean,如下所示。我有几个页面使用相同的bean。当我在页面之间导航时。 bean obj保持不变。即使我改变了会话(登录不同的用户)。 bean对象不会更改。
根据RequestScoped定义,bean实例应该为每个新请求重新创建。我错过了什么?
我正在使用JSF / Primefaces。在导航到detail.xhtml页面后,可以看到create.xhtml页面输入的值。在backing bean中,不会重新赋值。
谢谢,
张
=============================================== =============
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
@Named("targetManager")
@RequestScoped
public class TargetManager implements Serializable {
}
======================================
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>`
======================================
detail.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">
<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}" />
`
答案 0 :(得分:1)
CDI确实为每个请求创建了一个新对象,但没有为您的servlet创建新对象。
假设你有一个servlet,那么servlet实例只创建一次,如果你将一个请求范围的bean注入这个servlet,那么CDI就无法在servlet中交换bean实例,因为这可能导致不可预测的状态。因此,CDI为servlet创建了一个代理实例,它始终保持不变。这就是为什么你只获得bean实例的这个id,你正在检索CDI代理对象的id,而不是底层bean的id。当有新请求进入时,CDI会创建一个新的bean实例,并使用此bean为此特定请求支持代理。
答案 1 :(得分:0)
您可以通过输出创建时间来检查是否重新创建了它。您将看到它每次都输出不同的时间,这意味着它会在每次请求时重新创建。
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
@Named("targetInstructionManager")
@RequestScoped
public class TargetInstructionManager implements Serializable {
public TargetInstructionManager (){
System.out.println(System.currentTimeMillis());
}
}