Seam @Scope(ScopeType.CONVERSATION) ведет себя как область запроса

Я пытаюсь реализовать функцию, в которой компонент h:commandButton используется для создания строки h:dataTable при каждом нажатии кнопки. Я тестирую это, используя список строк. Когда страница загружается впервые, функция работает нормально, при нажатии кнопки создается строка со значением «Новый элемент». однако, когда я щелкаю по нему второй раз, кажется, что ArrayList из backbean ActionBean перераспределяется. Что я делаю не так?

Компонент действия:

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.ScopeType;

import jp.co.dir.bf.common.AppLogger;
import jp.co.dir.bf.front.common.BaseBean;

@Scope(ScopeType.CONVERSATION)
@Name("ActionBean")
public class ActionBean extends BaseBean {

    private AppLogger appLogger;
    private List<String> list  = new ArrayList<String>(); 
    public ActionBean() {
        
        appLogger = new AppLogger(Logger.getLogger(ActionBean.class));
    }
    public void init(){
        appLogger.showDebug("The Form is loaded");
                appLogger.showDebug("Initial Size: "+ list.size());

        
    }
    public AppLogger getAppLogger() {
        return appLogger;
    }
    public void setAppLogger(AppLogger appLogger) {
        this.appLogger = appLogger;
    }
    
    public List<String> getList(){
        return list;
    }
    
    public void addToList(){
        
        list.add(new String("New Item"));
               /////This is always printing 1 after each add.
        appLogger.showDebug("Item added: "+ list.size());
    }
    public void setList(List<String> list){
        this.list = list;
    }
}

Xhtml:

<h:commandButton value = "Add New" >
<p:ajax listener = "#{ActionBean.addToList}" update = "table"/>
</h:commandButton>
            

<h:dataTable id = "table" value  = "#{ActionBean.list}" var = "item">
    <h:column>
    <h:outputText value  = "#{item}"/>
    </h:column>             
</h:dataTable>

@balusc Я новичок в JSF, поэтому, хотя я знаю, что пошло не так, я не совсем уверен, почему. Если вас не затруднит, можете дать краткое пояснение?

jironemo 09.02.2023 05:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я исправил проблему. Это глупость с моей стороны. Я забыл добавить @Begin(join = true) аннотация к init(), поэтому init вызывается при каждой загрузке, а не только один раз для каждого диалога. Надеюсь, кто-то найдет это полезным. Новый код Action Bean теперь:

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.ScopeType;

import jp.co.dir.bf.common.AppLogger;
import jp.co.dir.bf.front.common.BaseBean;

@Scope(ScopeType.CONVERSATION)
@Name("ActionBean")
public class ActionBean extends BaseBean {

    private AppLogger appLogger;
    private List<String> list  = new ArrayList<String>(); 
    public ActionBean() {
        
        appLogger = new AppLogger(Logger.getLogger(ActionBean.class));
    }

    @Begin(join = true) ///this is the part that is updated
    public void init(){
        appLogger.showDebug("The Form is loaded");
                appLogger.showDebug("Initial Size: "+ list.size());

        
    }
    public AppLogger getAppLogger() {
        return appLogger;
    }
    public void setAppLogger(AppLogger appLogger) {
        this.appLogger = appLogger;
    }
    
    public List<String> getList(){
        return list;
    }
    
    public void addToList(){
        
        list.add(new String("New Item"));
               /////This is always printing 1 after each add.
        appLogger.showDebug("Item added: "+ list.size());
    }
    public void setList(List<String> list){
        this.list = list;
    }
}

Другие вопросы по теме