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에서 잘 작동합니다.
빈 (bean)가 올바르게 각 대화를 만든 후 다시 만들어집니다 과도 대화를하고, 대화가 끝날 때까지 제대로 통해 인스턴스 상태를 유지합니다. 이것은 생성자 및 @PostConstruct 메서드를 디버깅하여 관찰했습니다. – user3540207
대화 인터페이스를 주입하고 isTransient()를 얻는 것은 디버깅 프로세스를 통해 항상 참이라고 말합니다. – user3540207
저는 Conversation 객체에서 begin() 및 end() 메서드를 사용하여 장시간 실행되는 bean을 수동으로 시작하고 중지하겠습니까? 컨테이너가 이것을 제어할까요? – user3540207