我有一个用例,我想验证一堆 viewParams,如果我发现验证错误,跳过 preRenderView 事件并只显示错误消息。这可能吗?
例如
<f:metadata>
<f:viewParam id="param1" name="p1" value="#{someBean.param1}" />
<f:viewParam id="param2" name="p2" value="#{someBean.param2}" />
<f:event type="javax.faces.event.PostValidateEvent" listener="#{someBean.validateParams}" />
<f:event type="javax.faces.event.PreRenderViewEvent" listener="#{someBean.viewAction}" />
</f:metadata>
方法 validateParams() 用于进行多字段验证,可能会像这样:
public void validateParams(ComponentSystemEvent event) {
UIComponent source = event.getComponent();
Integer value1 = (Integer) ((UIInput) source.findComponent("param1")).getLocalValue();
Integer value2 = (Integer) ((UIInput) source.findComponent("param2")).getLocalValue();
boolean valid1 = validOneField(value1);
boolean valid2 = validOneField(value2);
boolean valid12 = validBothFields(valid1, valid2);
if(!valid1);//add facesMessage
if(!valid2);//add facesMessage
if(!valid12);//add facesMessage
if (!valid1 || !valid2 || !valid12)
FacesContext.getCurrentInstance().renderResponse();
}
我的理解是,无论强制渲染响应如何,仍会调用 viewAction() 。我可以轻松修改 viewAction() 以将验证考虑在内,但由于其他原因(该方法中有一些我宁愿不接触的杂乱代码等),我想完全跳过它。有没有办法可以完全绕过 viewAction() 并显示验证错误消息?
编辑:使用 FacesContext.getCurrentInstance().ValidationFailed() 的 BalusC 建议
我已将 validateParams() 修改为:
public void validateParams(ComponentSystemEvent event) {
UIComponent source = event.getComponent();
Integer value1 = (Integer) ((UIInput) source.findComponent("param1")).getLocalValue();
Integer value2 = (Integer) ((UIInput) source.findComponent("param2")).getLocalValue();
boolean valid1 = validOneField(value1);
boolean valid2 = validOneField(value2);
boolean valid12 = validBothFields(valid1, valid2);
if(!valid1);//add facesMessage
if(!valid2);//add facesMessage
if(!valid12);//add facesMessage
if (!valid1 || !valid2 || !valid12)
FacesContext.getCurrentInstance().ValidationFailed();
FacesContext.getCurrentInstance().renderResponse();
}
和修改后的 viewAction() 如下:
public void viewAction(ComponentSystemEvent cse) {
if(!FacesContext.getCurrentInstance().isValidationFailed()) {
// viewAction() code
}
}
这似乎现在对我有用。希望 JSF 2.2 中的视图操作不需要我检查验证是否失败,因为我相信它们根本不会被调用(FacesContext.renderResponce() 将跳过调用应用程序步骤,这是调用视图操作的地方) .