さて、私は ConversationScoped を使用しています。PostConstruct が会話の開始時に 1 回だけ呼び出されることを願っています。以下を参照してください。
@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 に commandButton の「保存」があり、このボタンが呼び出されると、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=#」がオンリックの実行を回避することは理解しています。これが問題だと思いますが、修正方法がわかりません。注意: postConstruct は常に前に呼び出されるため、salvarAndRedirecionar() メソッドは呼び出されません。
2) 別の質問があります: 会話を始めても終わらない場合は、何か問題がありますか? 会話を手動で終了したくない場合があります。これは、ページが 1 つしかないためです。開始するだけです。