Я думаю, что вы ошибочно смешиваете несколько вещей, которые должны быть разделены: взаимодействие с пользовательским интерфейсом и бизнес-логика.
Это правда, что взаимодействие с пользовательским интерфейсом пытается имитировать бизнес-логику, требуя наличия определенных значений идействует до продолжения.Но, как вы можете видеть, это не всегда может быть сделано идеально, потому что бизнес-логика может потребовать более сложных проверок, как в этом случае.
Однако я не вижу, в чем проблема.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
}