Spring e BeanValidation

Oi Galera!

Estou usando Spring 3 e o JSR 303 Bean Validation (Hibernate Validation).
Bem, eu tenho um metodo em um controller que recebe um bean valido. Quando o bean é invalido, o spring retorna para mim uma pagina de erro (HTTP 500) bom o BindException com os erros de validação.

Eu gostaria de saber como que eu posso lidar com o erro de validação.
Eu tentei colocar no meu formulario a tag form:errors mas o erro persiste.
Gataria de que, após o erro, o spring retornace para o formulário indicando os erros.

Grato

Metodo do Controller

	@RequestMapping(value="/adicionar.do",method=RequestMethod.POST)
	public String adicionar(@Valid Cliente cliente, ModelMap model) {
		cliente.setUsuarioRegistro(UsuarioLogado.getUsername());
		
		try {
			this.clienteService.salvarCliente(cliente);
		} catch (ErroBancoDados e) {
			model.addAttribute("erro", e.getMessage());
		}

		return "redirect:pesquisar.do";
	}

Meu formulário

	<form:form modelAttribute="cliente"  action="/requisiteworks/cliente/adicionar.do" method="POST">
	<form:errors path="*"></form:errors>
		<table class="form">
			<tr>
				<td>
					<form:label path="nomeFantasia" >Nome Fantasia: </form:label>
				</td>
				<td>
					<form:input path="nomeFantasia"/>
				</td>
			</tr>
			
			<tr>
				<td>
					<form:label path="razaoSocial">Razão Social: </form:label>
				</td>
				<td>
					<form:input path="razaoSocial"/>
				</td>
			</tr>
		</table>
		<p>
			<input type="submit" value="Salvar"/>
		</p>
	</form:form>

Vejo 3 formas de fazer:

1 - Não usar o @Valid, e controlar o fluxo dentro do seu método, exemplo:

    @RequestMapping(method = RequestMethod.POST)
    public String processSubmit(
            @ModelAttribute("pet") Pet pet,
            BindingResult result, SessionStatus status) {

        new PetValidator().validate(pet, result);
        if (result.hasErrors()) {
            return "petForm";
        }
        else {
            this.clinic.storePet(pet);
            status.setComplete();
            return "redirect:owner.do?ownerId=" + pet.getOwner().getId();
        }
    }

2 - Criar um Handler com interceptors, assim você intercepta as chamadas, exemplo:

<beans>
    <bean id="handlerMapping"
          class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="interceptors">
            <list>
                <ref bean="officeHoursInterceptor"/>
            </list>
        </property>
        <property name="mappings">
            <value>
                /*.form=editAccountFormController
                /*.view=editAccountFormController
            </value>
        </property>
    </bean>

    <bean id="officeHoursInterceptor"
          class="samples.TimeBasedAccessInterceptor">
        <property name="openingTime" value="9"/>
        <property name="closingTime" value="18"/>
    </bean>
<beans>

3 - Usar a anotação @ExceptionHandler:

@ExceptionHandler(IOException.class)
  public String handleIOException(IOException ex, HttpServletRequest request) {
    return ClassUtils.getShortName(ex.getClass());
  }

Fonte: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html

Talvez seja necessário implementar alguma coisa… para ter uma solução mais genérica e definitiva para todos os casos…

Nos exemplos que eu vejo do Spring, não é preciso nenhuma configuração extra para esse comportamento.
Imagino se alguma configuração que eu fiz esta conflitando…

Experimenta colocar na assinatura do seu método um BindingResult…

ex:

public String adicionar(@Valid Cliente cliente, BindingResult bind, ModelMap model) {  

para ver se ao invés… de dar um erro 500 ele entra no seu método…

[tinha feito uma pergunta idiota aqui]