gpt4 book ai didi

validation - 在“调用应用程序”阶段将inputText标记为无效

转载 作者:行者123 更新时间:2023-12-03 08:55:56 24 4
gpt4 key购买 nike

我正在“调用应用程序”阶段执行一些业务规则验证,并且当发生错误时,将引发自定义异常。定制异常在定制JSF ErrorHandler中处理,在该组件中,有问题的输入组件将被标记为无效,在FacesContext上创建的FacesMessages和验证将失败。

Bean

public void performAction() {

if ("aaa".equals(input)) {
// custom exception: arg1 - Error Message, arg2 - clientId
throw new ServiceValidationException("Something went wrong", ":f:input");
}
}

XHTML
<h:form id="f">
<p:inputText id="input" value="#{bean.input}" />
<h:commandButton value="Submit" action="#{bean.performAction}"/>
</h:form>

自定义JSF ErrorHandler
@Override
public void handle() throws FacesException {

try {
Iterator<ExceptionQueuedEvent> unhandledExceptionQueuedEvents = getUnhandledExceptionQueuedEvents().iterator();
if (unhandledExceptionQueuedEvents.hasNext()) {
Throwable exception = unhandledExceptionQueuedEvents.next().getContext().getException();
Throwable rootCause = unwrapRootCause(exception);

if (rootCause instanceof ServiceValidationException) {

ServiceValidationException sve = (ServiceValidationException) rootCause;
JSFComponentUtil.markComponentAsInvalid(sve.getClientId());
// create FacesMessage here etc
...
FacesContext.getCurrentInstance().validationFailed();
return;
}
}
} catch (Exception e) {
logger.error("Error encountered while processing exception, allow default error handling to take over", e);
}
// delegate to Omnifaces Ajax exception handler
super.handle();
}

JSFComponentUtil
public static void markComponentAsInvalid(String componentId) {
UIComponent component = findComponent(componentId);
if (component != null && component instanceof EditableValueHolder) {
EditableValueHolder evh = (EditableValueHolder) component;
if (evh.isValid()) {
evh.setValid(false);
}
} else {
LOG.debug("component not found or is not instance of EditableValueHolder");
}
}

public static UIComponent findComponent(String componentId) {
UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
if (viewRoot != null) {
return viewRoot.findComponent(componentId);
}
LOG.debug("View Root is null, returning null");
return null;
}

问题
我遇到的问题是,通过命令按钮提交表单后,页面会重新显示,输入文本字段标记为红色(预期行为),但是在该字段中键入的文本会丢失。我希望输入的无效文本保留在该字段中。

最佳答案

在markComponentInvalid中,您可以尝试手动设置组件的值:

evh.setSubmittedValue("aaa");
evh.setValue("aaa");

当然,您可以在ServiceValidationClass中添加“input”属性,而不是硬编码“aaa”,这样您就可以将该值从action方法传递给错误处理程序,然后传递给Util类,例如

bean :
throw new ServiceValidationClass ("Something went wrong", ":f:input", input);

错误处理程序:
JSFComponentUtil.markComponentAsInvalid(sve.getClientId(), sve.getInput());

等等

关于validation - 在“调用应用程序”阶段将inputText标记为无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25529637/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com