ОБНОВЛЕНИЕ
После комментариев я попытался свести пример кода к минимальной части, и (благодаря Балушу) я обнаружил, что это не связано с наследованием, ни с jpa, ни со ссылкой на затмение. ,Простая страница с двумя кнопками и одним контроллером, имеющим только одно поле: при первом нажатии одной кнопки она не перезагружает страницу и не выполняет прослушиватель, во второй раз перезагружается страница и никогда не вызывается прослушиватель. Выполните две частикода
partdetails.xhtml
<?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:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title></title>
</h:head>
<h:body>
<h:form id="form">
<div class="border">
<h:outputText value="#{partDetailsController.editing}" />
</div>
<h:panelGrid columns="2">
<f:facet name="footer">
<br />
<p:commandButton id="btnEditCancel" value="Cancel" update=":form" actionListener="#{partDetailsController.onBtnEditCancelClick}"
immediate="true" />
<p:commandButton id="btnEdit" value="Edit" update=":form" actionListener="#{partDetailsController.onBtnEditClick}"
style="margin-right: 0.9em;" />
</f:facet>
</h:panelGrid>
</h:form>
</h:body>
</html>
и контроллера (partDetailsController.java)
package test.controllers.views;
import java.io.Serializable;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
@ManagedBean
@ViewScoped
//public class PartDetailsController extends PartBaseController implements Serializable
public class PartDetailsController implements Serializable
{
private static final long serialVersionUID = 6704867527770742213L;
private boolean editing = false;
private static final Logger LOG = Logger.getLogger(PartDetailsController.class.getName());
/**
* Costruttore della classe.
*/
public PartDetailsController()
{
LOG.info("constructor");
}
@PostConstruct
public void init()
{
LOG.info("init");
}
public boolean isEditing()
{
return editing;
}
public void setEditing(boolean editing)
{
this.editing = editing;
}
public void onBtnEditClick(ActionEvent event)
{
LOG.info("edit pushed, editing value was "+ isEditing());
editing = true;
}
public void onBtnEditCancelClick(ActionEvent event)
{
LOG.info("cancel pushed, editing value was "+ isEditing());
editing = false;
}
}
Приложение имеет аутентификацию, в web.xml
<login-config>
<auth-method>FORM</auth-method>
<realm-name>ourSecurity</realm-name>
<form-login-config>
<form-login-page>/login.xhtml</form-login-page>
<form-error-page>/permissiondenied.xhtml</form-error-page>
</form-login-config>
</login-config>
Чтобы описать поведение, используя распечатанный журнал:
Загрузите страницу -> в журнал «конструктор», «init» (как и ожидалось)
Нажмите «Правка» -> в журнал ». , значение редактирования было ложным "(как и ожидалось)
Нажмите Редактировать еще раз -> в журнал" Конструктор "," init "(ожидаемое" редактирование отправлено, значение редактирования было истинным ")
С этого момента слушательбольше никогда не вызывается, пока вы не перезагрузите страницу в браузере
У вас есть какие-либо подсказки, где искать?
спасибо
ОБНОВЛЕНИЕ 2 Приложение бuild с простыми лицами 3.5
ОБНОВЛЕНИЕ 3
мы используем JSF 2.2
Мы протестировали его в среде glassfish3.1.2 и на Payara5тоже