JSF 2.0: How to skip JSR-303 bean validation?

為{幸葍}努か 提交于 2019-11-28 18:54:55

Set your event handlers as immediate=true and call FacesContext.renderResponse() before exiting them.

UPDATE:

Modifications in your example form:

<h:form id="form">
    <h:commandButton value="Add row">
        <!-- Added immediate="true" to call bean.add() before validation phase -->
        <f:ajax execute="foo" listener="#{bean.add()}" render="foo" immediate="true"/>
    </h:commandButton>
    <h:dataTable id="foo" var="foo" value="#{bean.foos}">
        <h:column>
            Name: <h:inputText id="field" value="#{foo.name}" required="true" />
            <h:messages for="field" />
        </h:column>
        <h:column>
            <h:commandButton value="Remove">
                <!-- Added immediate="true" to call bean.remove() before validation phase -->
                <f:ajax execute=":form:foo" listener="#{bean.remove(foo)}" render=":form:foo" immediate="true"/>
            </h:commandButton>
        </h:column>
    </h:dataTable>
</h:form>

Modifications in your bean code:

...
public void add() {
    // Your add() code
    ...
    // Added FacesContext.renderResponse() call to skip to render response phase
    FacesContext.getCurrentInstance().renderResponse();
}
...
public void remove() {
    // Your remove() code
    ...
    // Added FacesContext.renderResponse() call to skip to render response phase
    FacesContext.getCurrentInstance().renderResponse();
}
...

You can disable the bean validation with the tag f:validateBean that has an attribute disabled.

Example:

<h:inputText value="#{bean.name}">
   <f:validateBean disabled="#{anotherBean.flag}"/>
</h:inputText>

We have just published a solution for this problem. The full detail is here: http://www.springfuse.com/2011/12/15/skip-jsf-validation-depending-on-action.html

In short, it leverages the binding attribute of the validateBean tag. Doing so enable you to intercept the validate method and decide, based on the button clicked, whether to let it go through or not.

Situation: In the page code there is a big form with a lot of input fields. There are several buttons each pointing to separate action in the separate bean.

A solution that worked for me...

  1. In the page code: add immediate="true" to the button and provide an id for the input fields that You want to use in the bean.
 <p:inputText id="someHtmlInputId"
               maxlength="30" 
               value="#{beanName.attr}" />


 <p:commandButton id="someHtmlButtonId"
                   actionListener="#{beanName.doStuff}" 
                   value="Button Label"
                   ajax="false"
                   immediate="true"/>
  1. In the bean doStuff method get the parametes by the name fragment couse before the input name JSF put some other identifiers and the resulting parameter name may look like this: someFormId:j_idt54:someHtmlInputId
Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
if (params != null) {
  for (String k: params.keySet())
      if (k.indexOf("someHtmlInputId") != -1)
          params.get(k); // This is Your input parameter value waiting to be processed ;)
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!