2
respostas

não consigo adicionar um objeto ao modelandview, erro no validator

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");
        }


    }
2 respostas

Oi Alberto! Tudo bem?

Poderia compartilhar seu código (git ou zip) para que eu tente ajudá-lo? A principio eu não vejo relação da linha com a validação.

Caso seja possível, eu rodo um debug para entender o que está acontecendo direitinho.

Fico no aguardo,

Rodrigo

Rodrigo, segue link https://github.com/AndreCarvalho94/ehospedagem o problema está no arquivo ReservaController, a partir da linha 56

@GetMapping("reservas")
    public ModelAndView reservas(Hospede hospede) {
        ModelAndView modelAndView = new ModelAndView("reservas/reservas");
        hospede.setReservas(this.reservaService.consultarReservas(hospede.getId()));
        modelAndView.addObject("hospede", hospede);
        modelAndView.addObject("reservas", hospede.getReservas());
        return modelAndView;
    }

quando eu utilizo o validation do reserva, sempre dá problema, mas se eu utilizar só o validation do hospede funciona normalmente, usando os dois também não dá certo, por algum motivo ele tenta validar o hospede usando o reservavalidation.