Spring 未调用JSF操作(一种情况有效,而第二种情况无效)

Spring 未调用JSF操作(一种情况有效,而第二种情况无效),spring,primefaces,jsf-2.2,spring-web,Spring,Primefaces,Jsf 2.2,Spring Web,我在使用p:commandButton执行jsf操作时遇到了奇怪的行为。相应的页面负责一些创建和更新任务。因此,我可以使用空白表单访问页面,或者继续使用加载到表单中的一些已保存的数据。未按预期工作的按钮将触发保存操作以持久保存表单信息 现在我的问题是:当我继续处理一些已经保存的数据并单击“保存”时,一切正常。该操作被调用,数据被持久化或显示验证错误。下面是我通过登录MyPhaseListener.afterPhase()得到的一些日志语句。我剪切了一些日志行,这些日志行实际上确认了我的数据被持久

我在使用p:commandButton执行jsf操作时遇到了奇怪的行为。相应的页面负责一些创建和更新任务。因此,我可以使用空白表单访问页面,或者继续使用加载到表单中的一些已保存的数据。未按预期工作的按钮将触发保存操作以持久保存表单信息

现在我的问题是:当我继续处理一些已经保存的数据并单击“保存”时,一切正常。该操作被调用,数据被持久化或显示验证错误。下面是我通过登录MyPhaseListener.afterPhase()得到的一些日志语句。我剪切了一些日志行,这些日志行实际上确认了我的数据被持久化

10:43:53,959 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
10:43:53,960 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) AFTER PHASE RESTORE_VIEW 1
10:43:53,960 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) Method expression of the action being invoked: #{tollRegistrationBean.saveRegistration('CUSTOMER_DATA')}
10:43:53,960 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
10:43:53,961 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
10:43:53,961 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) AFTER PHASE APPLY_REQUEST_VALUES 2
10:43:53,962 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) Method expression of the action being invoked: #{tollRegistrationBean.saveRegistration('CUSTOMER_DATA')}
10:43:53,962 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
10:43:53,963 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
10:43:53,964 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) AFTER PHASE PROCESS_VALIDATIONS 3
10:43:53,964 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) Method expression of the action being invoked: #{tollRegistrationBean.saveRegistration('CUSTOMER_DATA')}
10:43:53,964 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
10:43:53,965 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
10:43:53,965 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) AFTER PHASE UPDATE_MODEL_VALUES 4
10:43:53,965 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) Method expression of the action being invoked: #{tollRegistrationBean.saveRegistration('CUSTOMER_DATA')}
10:43:53,966 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
10:43:54,041 INFO  [com.egrima.cockpit.beans.toll.TollRegistrationBean] (http-localhost/127.0.0.1:8080-1) WEB: TOLL_REGISTRATION_SAVE "registrationId:210001-2783,registrationStatus:OPEN"
10:43:54,081 DEBUG [com.egrima.cockpit.beans.toll.TollRegistrationBean] (http-localhost/127.0.0.1:8080-1) Registration saved by user noreply@example.com and customer number 210001
10:43:54,081 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
10:43:54,082 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) AFTER PHASE INVOKE_APPLICATION 5
10:43:54,083 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) Method expression of the action being invoked: #{tollRegistrationBean.saveRegistration('CUSTOMER_DATA')}
10:43:54,083 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
10:43:54,121 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
10:43:54,121 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) AFTER PHASE RENDER_RESPONSE 6
10:43:54,121 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) Method expression of the action being invoked: #{tollRegistrationBean.saveRegistration('CUSTOMER_DATA')}
10:43:54,121 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
现在的问题是,当我保存新数据时,没有调用任何操作。因此,目标不是更新现有数据,而是插入新数据,但这种差异对于我的JPA层来说比JSFbean更有趣。生命周期已正常处理,但未调用任何操作

10:51:10,813 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
10:51:10,813 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) AFTER PHASE RESTORE_VIEW 1
10:51:10,813 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
10:51:10,813 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
10:51:10,813 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) AFTER PHASE APPLY_REQUEST_VALUES 2
10:51:10,814 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
10:51:10,814 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
10:51:10,814 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) AFTER PHASE PROCESS_VALIDATIONS 3
10:51:10,814 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
10:51:10,814 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
10:51:10,814 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) AFTER PHASE UPDATE_MODEL_VALUES 4
10:51:10,814 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
10:51:10,814 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
10:51:10,815 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) AFTER PHASE INVOKE_APPLICATION 5
10:51:10,815 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
10:51:10,825 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
10:51:10,825 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) AFTER PHASE RENDER_RESPONSE 6
10:51:10,825 INFO  [com.egrima.cockpit.server.LifeCycleListener] (http-localhost/127.0.0.1:8080-1) --------------------------------------------------------------------
除了调用动作外,它看起来非常相似。这就是我无法理解的。我正在点击完全相同的按钮并调用完全相同的操作

这是我完整的xhtml文件和h:form。我把它稍微缩短了一点。整个文件包含更多的输入字段(它们都遵循相同的模式)和一些额外的标记,这些标记仅对样式设置非常重要

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:fn="http://java.sun.com/jsp/jstl/functions"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <h:form id="tollCustomerForm">

        <h:panelGrid columns="3" cellpadding="0" styleClass="width-100" columnClasses="width-50 valign-top, width-50 valign-top">

            <h:panelGrid columns="2" columnClasses="width-30, width-70 space-right" rendered="#{tollRegistrationBean.registration.customerData.company.visible}">
                <h:panelGroup>
                    <h:outputLabel for="inputCompany" value="#{msg.toll_registration_customerData_company}" />
                    <h:outputLabel value=" #{msg.gloabl_required_field_sign}" rendered="false" />
                </h:panelGroup>
                <h:inputText id="inputCompany" value="#{tollRegistrationBean.registration.customerData.company.value}"
                    styleClass="#{!component.valid ? 'errorInputText' : 'dkv-inputText'}" readonly="true" disabled="#{tollRegistrationBean.registrationSent}"
                    label="#{msg.toll_registration_accordion_tab_customer_data} - #{msg.toll_registration_customerData_company}" required="false" />
            </h:panelGrid>
            <h:panelGrid columns="2" columnClasses="width-30, width-70 space-right" rendered="#{tollRegistrationBean.registration.customerData.addressAddition.visible}">
                <h:panelGroup>
                    <h:outputLabel for="inputCountry" value="#{msg.toll_registration_customerData_country}" />
                    <h:outputLabel value=" #{msg.gloabl_required_field_sign}" rendered="false" />
                </h:panelGroup>
                <h:inputText id="inputCountry" value="#{tollRegistrationBean.getCountryName(tollRegistrationBean.registration.customerData.country.value)}"
                    styleClass="#{!component.valid ? 'errorInputText' : 'dkv-inputText'}" readonly="true" disabled="#{tollRegistrationBean.registrationSent}"
                    label="#{msg.toll_registration_accordion_tab_customer_data} - #{msg.toll_registration_customerData_country}" required="false" />
            </h:panelGrid>
            <h:panelGrid columns="2" columnClasses="space-left width-30, width-70" rendered="#{customerBean.renderCustomernumbers}">
                <h:panelGroup>
                    <h:outputLabel for="inputCustomerNumber" value="#{msg.toll_registration_customerData_customerNumber}" />
                    <h:outputLabel value=" #{msg.gloabl_required_field_sign}" rendered="false" />
                </h:panelGroup>
                <h:inputText id="inputCustomerNumber" value="#{customerBean.customernumber}"
                    styleClass="#{!component.valid ? 'errorInputText' : 'dkv-inputText'}" readonly="true" disabled="#{tollRegistrationBean.registrationSent}"
                    label="#{msg.toll_registration_accordion_tab_customer_data} - #{msg.toll_registration_customerData_customerNumber}" required="false" />
            </h:panelGrid>
            <h:panelGrid columns="2" columnClasses="space-left width-30, width-70" rendered="#{tollRegistrationBean.registration.customerData.email.visible}">
                <h:panelGroup>
                    <h:outputLabel for="inputEmail" value="#{msg.toll_registration_customerData_email}" />
                    <h:outputLabel value=" #{msg.gloabl_required_field_sign}" rendered="false" />
                </h:panelGroup>
                <h:inputText id="inputEmail" value="#{tollRegistrationBean.registration.customerData.email.value}"
                    styleClass="#{!component.valid ? 'errorInputText' : 'dkv-inputText'}" readonly="true" disabled="#{tollRegistrationBean.registrationSent}"
                    label="#{msg.toll_registration_accordion_tab_customer_data} - #{msg.toll_registration_customerData_email}" required="false" />
            </h:panelGrid>

        </h:panelGrid>

        <!-- ########## THE STRANGE SAVE BUTTON ########## -->
        <p:commandButton value="#{msg.toll_registration_accordion_save_step_button}" id="saveRegBtn" update=":tollAccordion :tollSelectionForm:globalMessages :tollSelectionForm:registrationProgressBar"
            action="#{tollRegistrationBean.saveRegistration('CUSTOMER_DATA')}" disabled="#{tollRegistrationBean.registrationSent}" styleClass="dkv-button" >
                <p:resetInput target=":tollAccordion:tollCustomerForm" />
        </p:commandButton>
        <!-- ########## THE STRANGE SAVE BUTTON ########## -->

        <!-- preValidation method only executed, if submit button is pressed (not called, if save-button is clicked) -->
        <h:panelGroup rendered="#{param['tollAccordion:tollCustomerForm:saveAndNextStepRegBtn']!=null}">
            <f:event listener="#{tollRegistrationBean.listenNextAccordionStep}" type="preValidate" />
            <f:attribute name="currentAccordionStep" value="CUSTOMER_DATA" />
        </h:panelGroup>

    </h:form>
</ui:composition>
我使用的是JSF2.2、PrimeFaces5.2和Spring4.1.4.RELEASE

是否有人过期了相同或类似的问题?如果有任何帮助或提示,我将非常感激。我有点受不了了

谢谢和问候
塞巴斯蒂安

早上好,塞巴斯蒂安

如果p:remoteCommand仍在运行,则无法提交表单。 你必须把它放在一个单独的表格里


致以最诚挚的问候

您正在使用Spring。。。为什么不将其添加到标记中?您可以将整个表单附加到您的帖子中吗?我更新了上面的spring信息和标记(感谢您的提示),并在下面发布了我的xhtml文件。您如何知道OP使用的是remoteCommand?在问题的任何地方都没有说明(反正我可以看到)。是否有一些文件说明了你在这里的信息作为答案?
@Component
@Scope("view")
public class TollRegistrationBean implements Serializable {

    ...

    @PostConstruct
    public void init() {

        // get registrationId by param and load registration
        RequestContext context = RequestContext.getCurrentInstance();
        String registrationId = (String)context.getCallbackParams().get(TollRegistrationMainBean.CALLBACK_PARAM_SELECTED_REGISTRATION_ID);
        if (registrationId != null && !registrationId.isEmpty()) {
            registration = tollPersistingService.loadRegistrationAndCheckFields(registrationId);
        }

        if (registration != null) {
            createAccordionOrder();
            selectedTolls = registration.getTollTypes();

            // update saved customer data, read from DB, with data from crm
            tollCustomerBean.loadCustomerDataFromCRM(registration);
        }

        activeIndex = 0;
        registrationSent = false;
    }

    public void saveRegistration(String currentAccordionStep) {
        log.info("TollRegistrationBean.saveRegistration()");

        try {
            tollPersistingService.saveRegistration(registration, customerBean.getCustomernumber());
            activeIndex = accordionOrder.indexOf(currentAccordionStep);
            registration.getStepByStepName(StepName.valueOf(currentAccordionStep)).setCssAccordionIcon("");

            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_INFO, MessageUtils.getMessage("toll_registration_info_saved_successfully"), ""));

            String userEmail = UserUtils.getCurrentUser().getEmailAddress();
            log.database(AdvancedLoggerUtils.Actions.TOLL_REGISTRATION_SAVE.name(), registration.toDatabaseLogString(), userEmail,
                    AdvancedLoggerUtils.System.WEB.name());
            log.debug("Registration saved by user " + userEmail + " and customer number " + customerBean.getCustomernumber());
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
    }

}