好吧,我正在使用 ConversationScoped,我希望 PostConstruct 在对话开始时只被调用一次,请参阅:
@Named("disciplinaDetalheMB")
@ConversationScoped
public class DisciplinaDetalheMBImpl {
private static final long serialVersionUID = 1L;
@Inject
private Conversation conversation;
@Inject
@AnBasicBO
private BasicBO boPadrao;
@PostConstruct
public void postConstruct() {
logger.debug("Iniciando PostConstruct...");
init();
beginConversation();
}
public String salvarAndRedirecionar() {
salvar();
if (!FacesContext.getCurrentInstance().isValidationFailed()) {
return goToLastPage() + "?faces-redirect=true";
} else {
return "";
}
}
private void beginConversation() {
if (!conversation.isTransient()) {
endConversation();
}
conversation.begin();
if (conversation.isTransient()) {
throw new RuntimeException("A conversão não foi iniciada corretamente");
}
SessionContext.getInstance().setAttribute("cid", conversation.getId());
}
public BasicBO getBoPadrao() {
return boPadrao;
}
public void setBoPadrao(BasicBO boPadrao) {
this.boPadrao = boPadrao;
}
}
因此,当创建我的支持 bean 时,会话被初始化,CID 存储在会话中以供以后使用。我的 XHTML 中有一个命令按钮“保存”,当调用此按钮时,再次调用 PostConstruct,我不知道为什么:
<h:commandLink
action="#{managedBeanName.salvarAndRedirecionar()}"
styleClass="btn btn-info pull-right" value="Salvar">
<f:ajax execute="@form" />
</h:commandLink>
我注意到生成的 HTML 是:
<a id="formManterDisciplina:j_idt44:j_idt46" href="#" onclick="mojarra.ab(this,event,'action','@form',0);return false" class="btn btn-info pull-right" name="formManterDisciplina:j_idt44:j_idt46">Salvar</a>
所以,我理解“href=#”避免了onlick被执行。我认为这是问题所在,但我不知道如何解决。记住:salvarAndRedirecionar() 方法永远不会被调用,因为 postConstruct 总是在之前被调用。
2)我还有一个问题:如果我开始对话但没有结束,有什么问题吗?有时我不想手动结束对话,因为我只有一页,我才开始。