2014-10-22 6 views
0

Я определил компонент RequestScoped, как показано ниже, с аннотацией CDI. У меня есть несколько страниц, которые используют один и тот же компонент. Когда я перемещаюсь со страницы на страницу. Боб obj сохраняет то же самое. Даже когда я меняю сеанс (login wth different user). Объект bean не изменяется.Жизненный цикл CDI @RequestScoped bean

В соответствии с определением RequestScoped экземпляр bean-компонента должен воссоздавать для каждого нового запроса. Что-нибудь я пропустил?

Я использую JSF/Primefaces. Значение, введенное с страницы create.xhtml, можно увидеть после перехода на страницу detail.xhtml. В резервном компоненте значение не переопределяется.

Спасибо,

Чжан

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

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

Как вы узнали, что объект не изменен? –

+0

Я отлаживаю код. Идентификатор объекта всегда один и тот же. Доступ к значениям компонента можно получить из нескольких страниц. –

+0

Можете ли вы отправить часть, в которой вы отлаживаете код. –

ответ

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()); 
     } 
} 
+0

У меня есть '@PostConstruct \t общественного недействительный Init() {}' и я также положить конструктор в классе. Оба вызываются только при развертывании. Когда и после запуска приложения, он больше не вызывается –

0

CDI действительно создает новый объект для каждого запроса, но не для вашего сервлета или того, что вы используете.

Предполагая, что у вас есть сервлет, экземпляр сервлета создается только один раз, и если вы введете в него этот объект, то CDI не сможет обменять экземпляр компонента в сервлет, поскольку это может привести к непредсказуемым состояниям , Таким образом, CDI создает экземпляр прокси для сервлета, который остается неизменным все время жизни сервлета. Вот почему вы получаете только этот единственный идентификатор для экземпляра bean, вы извлекаете id прокси-объекта CDI, а не базового компонента. Когда приходит новый запрос, CDI создает новый экземпляр bean и обращается к прокси с этим компонентом для этого конкретного запроса.

+0

Ваши объяснения разумны. Одна вещь остается неясной: согласно объяснению прокси, значения из прокси должны меняться для каждого нового компонента (запроса). Но почему значение свойства bean (с EL), введенное с одной страницы, можно увидеть на другой странице без повторной привязки? thanks –

+0

Можете ли вы опубликовать более подробную информацию о своей настройке? боб, страница, ... должно быть что-то еще, что имеет другую область. – shillner

+0

Лучше всего было бы, если бы вы могли поделиться с нами минимальным проектом, который показывает это поведение. Спасибо – shillner

Смежные вопросы