【发布时间】:2012-08-17 04:30:50
【问题描述】:
我有一个用例,我想验证一堆 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() 将跳过调用应用程序步骤,这是调用视图操作的地方) .
【问题讨论】:
标签: validation jsf jsf-2