Сомнения в том, как комбинировать компоненты CDI: SessionScoped и RequestScoped - PullRequest
1 голос
/ 11 февраля 2012

Моя цель - представить страницу jsf с функциями создания, получения и обновления.Я решил создать разные компоненты CDI и разные составные компоненты для каждой из этих операций, а затем собрать все это вместе на странице.

Пока все хорошо, но я только что закончил и обнаружил действительно запутанную ошибку, ия не знаю, как это исправить:

Инструмент bean-компонента CDI, который выполняет операцию CREATE, является бином @RequestScoped, поэтому поля ввода очищают себя после запроса. (См. изображение ниже)

enter image description here

У меня нет с этим никаких проблем (только это предупреждение, от которого я не могу избавиться), оно работает нормально.

Следующий созданный мною гаджет - это данныетаблица, которая также может редактировать данные.Для этого мне нужно было использовать бин CDI @SessionScopped. (См. Изображение ниже)

enter image description here

Возникает проблема: при визуализации страницы бин @SessionScoped кэширует данныев сеансе, но при вставке новых данных с использованием bean-компонента @RequestScoped данные отправляются в базу данных, но таблица данных не отображает новые введенные значения, потому что их нет в сеансе.

Так чтоя должен делать?Здесь я покажу вам два боба:

СОЗДАНИЕ БИНА

@Named("subjectControllerCreate")
@RequestScoped
public class SubjectControllerCreate implements Serializable {

    private Subject currentSubject;
    @EJB
    private SubjectFacade ejbFacade;

    //INITIALIZATION
    public SubjectControllerCreate() {
        currentSubject = new Subject();
    }


    //CREATE


       public String create() {
            try {         
                    currentSubject.setCreationDate(new Date());
                    getSubjectFacade().create(currentSubject);//Adds the current subject to the database!
                    JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("SubjectCreated"));
                    return "";//Can perform a redirect here if we want
                //}
                //return null;
            } catch (Exception e) {
                JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
                return null;
            }
        }

ОБНОВЛЕНИЕ БИНА

@Named("subjectControllerUpdate")
@SessionScoped
public class SubjectControllerUpdate implements Serializable {

    //Using DataModel<Subject> instead of List<Subject> is necessary in order to be able to get the current row.
    private DataModel<Subject> subjects;    
    @EJB
    private SubjectFacade ejbFacade;

    //INITIALIZATION   
    @PostConstruct
    public void init() {
       subjects = new ListDataModel<Subject>(getSubjectFacade().findAll());
    }

    //RETRIEVE
    public DataModel<Subject> retrieve() {
        return subjects;
    }

    //UPDATE
    public void update() {
        getSubjectFacade().edit(subjects.getRowData());
    }

    //HELP METHODS
    //RETURN THE FACADE FOR DATA MANIPULATION(Best practice)
    private SubjectFacade getSubjectFacade() {
        return ejbFacade;
    }

    //GETTERS AND SETTERS
    public DataModel<Subject> getSubjects() {
        return subjects;
    }

    public void setSubjects(DataModel<Subject> subjects) {
        this.subjects = subjects;
    }        
}
* 1030Возможно ли сделать так, чтобы таблица данных отправляла некоторый ajax-запрос, когда обнаруживает, что диалоговое окно «Создать» закрывается, чтобы получить оставшиеся вновь введенные данные?Если да, то как я могу это сделать?

Это наценка для моего источника данных:

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

    <h:form>
        <p:dataTable id="allSubjects" var="subject" value="#{subjectControllerUpdate.subjects}" paginator="true" rows="7" >
            <p:ajax event="rowEdit" listener="#{subjectControllerUpdate.update()}"/>
            <p:column headerText="Name" sortBy="#{subject.name}" style="width:200px" >
                <p:cellEditor>  
                    <f:facet name="output">  
                        <h:outputText value="#{subject.name}"/>  
                    </f:facet>  
                    <f:facet name="input">  
                        <p:inputText value="#{subject.name}" style="width:100%"/>  
                    </f:facet>  
                </p:cellEditor>  
            </p:column>

            <p:column sortBy="#{subject.description}" headerText="Description">               
                <p:cellEditor>  
                    <f:facet name="output">  
                        <h:outputText value="#{subject.description}"/>  
                    </f:facet>  
                    <f:facet name="input">  
                        <p:inputText value="#{subject.description}" style="width:100%"/>  
                    </f:facet>  
                </p:cellEditor>    
            </p:column>

            <p:column sortBy="#{subject.credits}" headerText="Credits" style="width:50px">
                <p:cellEditor>  
                    <f:facet name="output">  
                        <h:outputText value="#{subject.credits}"/>  
                    </f:facet>  
                    <f:facet name="input">  
                        <p:inputText value="#{subject.credits}" style="width:100%"/>  
                    </f:facet>  
                </p:cellEditor>
            </p:column>

            <p:column headerText="Options" style="width:50px">                   
                <p:rowEditor />
            </p:column>         
        </p:dataTable>
    </h:form>    

</html>

Я буду признателен за вашу помощь

1 Ответ

2 голосов
/ 11 февраля 2012

Разве вы не можете просто внедрить bean-компонент @SessionScoped в bean-компонент @RequestScoped и, когда нажата кнопка create, вызвать обновление метода в bean-компоненте @SessionScoped?

...