2014-04-16 3 views
0

ConversationScope의 Bean에 대한 작업 메소드가 실행되지 않는 이유를 이해하는 데 문제가 있습니다.렌더링 된 commandlink를 사용하여 ConversationScoped bean 작업이 실행되지 않음

package org.work; 

import java.io.Serializable; 
import javax.enterprise.context.ConversationScoped; 
import javax.faces.event.ComponentSystemEvent; 
import javax.inject.Named; 

@Named 
@ConversationScoped 
public class NewClass implements Serializable { 

    private static final long serialVersionUID = 6470665657635110586L; 
    private boolean b1; 

    public boolean isB1() { 
     return b1; 
    } 

    public void setB1(boolean b1) { 
     this.b1 = b1; 
    } 

    public void preRenderView(ComponentSystemEvent evt) { 
    } 

    public String peformAction() { 
     return null; 
    } 
} 

내 XHTML은 다음과 같습니다 : 빈 (bean)은 내가 렌더링 다른 CommandLink는을 부울을 반전해야 CommandLink는을 누른 후

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core"> 
    <f:view> 
     <h:head> 

     </h:head> 
     <f:metadata> 
      <f:viewParam name="b1" 
         value="#{newClass.b1}" /> 
      <f:event type="preRenderView" 
        listener="#{newClass.preRenderView}"/> 
     </f:metadata> 
     <h:body> 
      <h:form> 
       <h:commandLink action="#{newClass.setB1(!newClass.b1)}" 
           style="background-color: #{newClass.b1 ? 'darkorchid' : 'aquamarine'};" 
           value="btn3"/> 
       <h:panelGrid rendered="#{newClass.b1}" 
          columns="1"> 
        <h:commandLink value="edit" 
            action="#{newClass.peformAction()}" /> 
       </h:panelGrid> 
      </h:form> 
     </h:body> 
    </f:view> 
</html> 

performAction() 메소드가 실행되지 않습니다. 디버깅 할 때 부울이 true로 설정되어있는 것을 볼 수 있지만 viewparams가 설정되기 전에 "렌더링 된"특성이 평가됩니다. 사실입니까? 이 예제는 @ManagedBean 및 @ javax.faces.bean.ViewScoped에서 잘 작동합니다.

답변

0

장기간 대화가 없다고 생각합니다. 이 사이트에 대한 자세한 정보를 읽을 수 있습니다 : http://docs.oracle.com/javaee/6/api/javax/enterprise/context/ConversationScoped.html

이 빈은 모든 요청

+0

빈 (bean)가 올바르게 각 대화를 만든 후 다시 만들어집니다 과도 대화를하고, 대화가 끝날 때까지 제대로 통해 인스턴스 상태를 유지합니다. 이것은 생성자 및 @PostConstruct 메서드를 디버깅하여 관찰했습니다. – user3540207

+0

대화 인터페이스를 주입하고 isTransient()를 얻는 것은 디버깅 프로세스를 통해 항상 참이라고 말합니다. – user3540207

+0

저는 Conversation 객체에서 begin() 및 end() 메서드를 사용하여 장시간 실행되는 bean을 수동으로 시작하고 중지하겠습니까? 컨테이너가 이것을 제어할까요? – user3540207