Mikhas
Maio 28, 2010, 10:55am
#1
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…
Mikhas
Maio 28, 2010, 11:36am
#3
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]