我有一个用例,我想在其中验证一堆viewParams,如果发现验证错误,请跳过preRenderView事件并显示错误消息。这可能吗?
e.g。
<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()并显示验证错误消息?
编辑:使用FaceusContext.getCurrentInstance()的BalusC建议.ValidationFailed()
我已将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()将跳过调用应用程序步骤,这是调用视图操作的地方)
答案 0 :(得分:1)
您可以查看FacesContext#isValidationFailed()
。
public void viewAction() {
if (!FacesContext.getCurrentInstance().isValidationFailed()) {
// ...
}
}
由于某些不明原因,您手动执行验证而不是使用JSF标准Validator
(您是否知道可以指定validator
,<f:validator>
和{{1在<f:validateXxx>
?)上,您需要在验证失败时手动调用<f:viewParam>
。