2012-02-11 5 views
1

私の目標は、Create、Retrieve、Update機能を持つjsfページを提示することです。 私は、この操作ごとに異なるCDI Beanとさまざまなコンポジットコンポーネントを作成し、それらをすべてページにまとめて配置することに決めました。CDI Beanの結合方法に関する疑問:SessionScopedとRequestScoped

これまでのところは良い、しかし、私はちょうど完成し、私は本当に混乱バグを発見し、私はそれを修正する方法がわからない:CREATE操作は@RequestScoped BeanでないCDIビーンツールを

、入力フィールドがそれらを要求した後の自分をきれいになる。(画像怒鳴るを参照してください)

enter image description here

私はそれと全く問題(私はオフに取り除くカントちょうどその警告を)持っていない、それが正常に動作します。

作成した次のガジェットは、データを編集できるデータテーブルです。 。私は@SessionScopped CDI Beanを使用するために必要な(下の画像を参照してください)

enter image description here

それを行うには、ここで問題が来る: ページがレンダリングされると@SessionScoped Beanがセッションにデータをキャッシュしますが、 @RequestScoped Beanを使用して新しいデータが挿入されると、データはデータベースに送られますが、セッションに含まれていないため、データテーブルには新しい入力値が表示されません。

どうすればよいですか? ここで私はあなたに2つのBeanが表示されます:UPDATEのBEAN

@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; 
    }   
} 

は、データテーブルには、いくつかのAJAXを送る作るために、それは多分可能ですBEAN

@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; 
      } 
     } 

をCREATE

をCreateダイアログが閉じたことを検出すると、新しく入力されたデータの残りの部分を取得しますか? はいの場合はどうすればいいですか?

これは私のDataTableのためのマークアップです:

<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> 

病気

答えて

2

はあなただけ@RequestScoped Beanに@SessionScoped Beanを注入し、作成をクリックしたときに、呼び出すことはできません、あなたの助けに感謝beanの@SessionScopedのメソッドの更新?

+0

はい、最も簡単で最適なオプションのようです。ありがとう! – sfrj

+0

あなたは歓迎です:) –

関連する問題