XPages / JSF возможно вызвать проверку из кода? - PullRequest
0 голосов
/ 21 сентября 2018

На странице x у меня есть валидация, привязанная к статусу объекта (черновик, для утверждения, утвержден).

<xp:inputText
    id="inpHighRiskCountry" styleClass="inputEscalation"
    value="#{matterBean.matter.escHighRisk}"
    validator="#{matterValidators.valEscHighRiskCountry}"
    disabled="#{!matterBean.matter.editable}">
    <xp:this.attrs>
        <xp:attr name="placeholder"
            value="#{matter.gen_EnterCountry}" />
    </xp:this.attrs>
    <xp:this.validators>
        <xp:validateRequired
            message="#{matter.msg_valid_esc_high_risk}" />
    </xp:this.validators>
    <xp:this.required><![CDATA[#{!(matterBean.matter.status eq "For approval")}]]></xp:this.required>
</xp:inputText>

В черновике статуса (значение по умолчанию) валидация не требуется.Перед отправкой на утверждение я хочу, чтобы проверка прошла.

Как я могу инициировать это?(например, инициировать проверку в любое время)

Теперь у меня под кнопкой «Отправить на утверждение» есть функция, которая пытается сохранить объект в бэкэнде.Поэтому сначала он устанавливает статус «Для утверждения», сохраняет объект.Я хотел бы, чтобы он выполнял «проверку», устанавливал статус, сохранял объект.

Я вебинифицирую существующее приложение, поэтому я сомневаюсь, что смогу ввести «промежуточный» статус.

1 Ответ

0 голосов
/ 24 сентября 2018

Я думаю, что вы ошибочно смешиваете несколько вещей, которые должны быть разделены: взаимодействие с пользовательским интерфейсом и бизнес-логика.

Это правда, что взаимодействие с пользовательским интерфейсом пытается имитировать бизнес-логику, требуя наличия определенных значений идействует до продолжения.Но, как вы можете видеть, это не всегда может быть сделано идеально, потому что бизнес-логика может потребовать более сложных проверок, как в этом случае.

Однако я не вижу, в чем проблема.JSF все еще может помочь вам вернуть ошибку на вход, который вам нужен.Если бы мне пришлось атаковать проблему, я бы удалил обязательный атрибут - и текст валидатора - для проверки на уровне действий, как вы уже поняли, просто я бы сделал это перед сохранением документа, а не вследствие неудачной попытки.save.

То, что вы можете просто сделать, это либо прикрепить его как общую ошибку, либо, если вы все еще хотите привязать его к определенному входу, сделать это.

Давайте возьмем второйподход:

<xp:inputText binding="#{inpHighRiskCountry}"
    id="inpHighRiskCountry" styleClass="inputEscalation"
    value="#{matterBean.matter.escHighRisk}"
    readonly="#{!matterBean.matter.editable}">
    <xp:this.attrs>
        <xp:attr name="placeholder"
            value="#{matter.gen_EnterCountry}" />
    </xp:this.attrs>
</xp:inputText>

<xp:message for="inpHighRiskCountry" />

<xp:button id="button1" value="Save">
    <xp:eventHandler event="onclick" submit="true"
        action="#{matterBean.sendToApproval}" />
</xp:button>

Для inputText я установил опцию binding, потому что, я думаю, из метода bean будет легче получить ввод.Затем я поместил компонент xp:message для отображения ошибки ввода и глупую кнопку с гипотетическим вызовом операции отправки на утверждение.

public void sendToApproval() {
    if (...) { // check your escHighRisk logic here
        FacesContext facesContext = FacesContext.getCurrentInstance();
        UIComponent component = facesContext
                .getApplication()
                .getVariableResolver()
                .resolveVariable(facesContext,
                "inpHighRiskCountry");

        String errorSummary = "Your error here";
        FacesUtil.addMessage(
                facesContext,
                FacesMessage.SEVERITY_ERROR,
                component,
                errorSummary,
                null;

        return;
    }

    // Code would continue here with saving or whatever else
}
...