2012-02-11 2 views
1

목표는 만들기, 검색 및 업데이트 기능이있는 jsf 페이지를 제시하는 것입니다. 이 작업 각각에 대해 서로 다른 CDI 빈과 다른 복합 구성 요소를 작성한 다음 페이지에 모두 넣기로 결정했습니다.CDI 빈을 결합하는 방법에 대한 의문점 : SessionScoped 및 RequestScoped

단지 완성하고 난 정말 혼란 버그를 발견하고, 내가 그것을 해결하는 방법을 모른다 지금까지 너무 좋아,하지만 난 :

(가) 작업을 CREATE 수행하는 CDI 빈 도구는 @RequestScoped 콩입니다 입력 필드 그들에게 요청 후 자아를 청소 때문에. 나는 전혀 (그냥 그 경고 내가 오프를 제거하지 못할)에 아무 문제가 없다

enter image description here

(이미지 울부 짖는 소리를 참조), 그것을 잘 작동합니다.

내가 만든 다음 가젯은 데이터를 편집 할 수있는 데이터 테이블입니다. . 그것이 내가이 @SessionScopped CDI 빈을 사용하는 데 필요한하려면

enter image description here 다음

문제 온다 (아래 이미지 참조) : 페이지가 @SessionScoped 콩이 렌더링 세션에서 데이터를 캐시하지만, @RequestScoped 빈을 사용하여 새 데이터가 삽입되면 데이터는 데이터베이스로 이동하지만 데이터 테이블은 세션에 없으므로 입력 된 새 값을 표시하지 않습니다.

그럼 어떻게해야합니까? 여기 난 당신에게 두 콩이 표시됩니다 :

빈 CREATE를

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

는 데이터 테이블 일부 아약스를 보낼 수 있도록 어쩌면 가능 Create 대화 상자가 닫히는 것을 감지하면 새로 입력 한 데이터의 나머지 부분을 가져 옵니까? 그렇다면 어떻게해야합니까?

내 데이터 테이블에 대한 마크 업입니다 :

<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 콩에 @SessionScoped 빈을 주입하고 클릭 만들면를 호출 할 수 없습니다 감사 bean @SessionScoped에서 메소드 새로 고침?

+0

네, 가장 쉽고 좋은 옵션으로 들립니다. 고마워! – sfrj

+0

당신은 환영합니다 :) –

관련 문제