Meu projeto tem duas classes principais: hospede e reserva, cada uma com seu respectivo validator. No controller de hospedes tenho um método que redireciona para uma página de exibição de reservas:
@GetMapping("reservas/{id_hospede}")
public ModelAndView reservas(@PathVariable(value = "id_hospede") Integer id, RedirectAttributes redirectAttributes) {
ModelAndView modelAndView = new ModelAndView("redirect:../../reservas/reservas");
Hospede hospede = this.hospedeService.consultar(id);
redirectAttributes.addFlashAttribute("hospede", hospede);
return modelAndView;
}
no controller de reservas:
@GetMapping("reservas")
public ModelAndView reservas(Hospede hospede) {
ModelAndView modelAndView = new ModelAndView("reservas/reservas");
modelAndView.addObject("hospede",hospede);
return modelAndView;
}
tenho uma jsp que chama o método no controller de hospedes que redireciona a requisição para o controller de reservas a fim de listar todas as reservas deste hóspede, mas sempre obtenho o erro:
java.lang.IllegalStateException: Invalid target for Validator [br.com.ehospedagem.reservas.validation.ReservaValidation@1134762f]: Zequinha,60000000000,98999999999,zequinha@teste.com.br
org.springframework.validation.DataBinder.assertValidators(DataBinder.java:542)
org.springframework.validation.DataBinder.addValidators(DataBinder.java:553)
br.com.ehospedagem.reservas.controller.ReservaController.initBinder(ReservaController.java:42)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:220)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134)
org.springframework.web.method.annotation.InitBinderDataBinderFactory.initBinder(InitBinderDataBinderFactory.java:62)
org.springframework.web.bind.support.DefaultDataBinderFactory.createBinder(DefaultDataBinderFactory.java:57)
org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:111)
org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)
org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:160)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:129)
esse problema só ocorre quando adiciono o objeto hospede ao modelandview de reservas, se eu tentar adicionar uma string por exemplo, o erro não acontece:
@GetMapping("reservas")
public ModelAndView reservas(Hospede hospede) {
ModelAndView modelAndView = new ModelAndView("reservas/reservas");
modelAndView.addObject("hospede",hospede); //erro nesse linha
return modelAndView;
}
e no reserva validation:
public class ReservaValidation implements Validator{
@Override
public boolean supports(Class<?> clazz) {
return Reserva.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
ValidationUtils.rejectIfEmpty(errors, "dataInicial", "field.required");
ValidationUtils.rejectIfEmpty(errors, "dataFinal", "field.required");
Reserva reserva = (Reserva) target;
Calendar dataAtual = Calendar.getInstance();
double diasPassados = (dataAtual.getTimeInMillis() - reserva.getDataInicial().getTimeInMillis())/1000/60/60/24;
if(diasPassados > 365) {
errors.rejectValue("dataInicial", "typeMismatch.reserva.dataInicial");
}
if(reserva.getDataInicial().getTimeInMillis() > reserva.getDataFinal().getTimeInMillis()) {
errors.rejectValue("dataFinal", "typeMismatch.reserva.dataFinal");
}
if(reserva.getTotalDiarias() < 1) {
errors.rejectValue("totalDiarias", "typeMismatch");
}
if(reserva.getTotalHospedes() < 1) {
errors.rejectValue("totalHospedes", "typeMismatch");
}
if(reserva.getValorDiaria().compareTo(BigDecimal.ZERO) < 1) {
errors.rejectValue("valorDiaria", "typeMismatch");
}
}