Arageron
Arageron

Reputation: 33

Invalid target for Validator - Spring MVC

I'm having problems with validating in Spring. I'm getting the following error after opening the form:

java.lang.IllegalStateException: Invalid target for Validator [com.example.validator.UserValidator@6ac0a8f4]: com.example.web.forms.UserDTO@4d3b2379

My Validator for the time being, wanted to check if anything works first:

@Component
public class UserValidator implements Validator {

    @Autowired
    ServiceUser serviceUser;

    @Override
    public boolean supports(Class<?> clazz) {
        return User.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {

        User user = (User) target;

        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "NotEmpty.userForm.name");

    }

}

Controller:

@Controller
public class UserController {
    @Autowired
    UserValidator userValidator;

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        CustomDateEditor editor = new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true, 10);
        binder.registerCustomEditor(Date.class, editor);
        binder.setValidator(userValidator);
//        binder.addValidators(userValidator);
    }

    final static Logger logger = Logger.getLogger(UserController.class);

    @Autowired
    protected ServiceUserImpl service;


    @RequestMapping("/lista")
    public String showIndex(Model model) {
        User contest = new User();
        model.addAttribute("element", contest);
        model.addAttribute("collection", service.findAll());
        return "lista";
    }

    @RequestMapping("/dodaj")
    public String showFormPublication(HttpServletRequest request, @ModelAttribute("userDto") @Valid UserDTO userDTO, BindingResult result) {
        if (request.getMethod().equalsIgnoreCase("post") && !result.hasErrors()) {
            if (result.hasErrors()) {
                return "forms/contest";
            } else {
                User user = new User();
                user.setId(userDTO.getId());
                user.setName(userDTO.getName());
                user.setSurname(userDTO.getSurname());
                user.setDateOfBirth(userDTO.getDateOfBirth());
                user.setIndexNumber(userDTO.getIndexNumber());
                user.setEmail(userDTO.getEmail());
                service.save(user);

                return "redirect:/lista";
            }
        }
        return "dodaj";
    }
}

Form in .jsp:

<form:form action="dodaj" method="POST" modelAttribute="userDto">
        <table border="1">
            <tbody>
            <tr>
                <th>Imię</th>
                <td>
                    <form:input type="text" path="name" />
                    <c:if test="${pageContext.request.method=='POST'}"><form:errors path="name" /></c:if>
                </td>
            </tr>
            <tr>
                <th>Nazwisko</th>
                <td>
                    <form:input type="text" path="surname" />
                    <c:if test="${pageContext.request.method=='POST'}"><form:errors path="surname" /></c:if>
                </td>
            </tr>
            <tr>
                <th>DataUrodzenia</th>
                <td>
                    <form:input type="date" path="dateOfBirth" />
                    <c:if test="${pageContext.request.method=='POST'}"><form:errors path="dateOfBirth" /></c:if>
                </td>
            </tr>
            <tr>
                <th>NumerIndeksu</th>
                <td>
                    <form:input type="number" path="indexNumber" />
                    <c:if test="${pageContext.request.method=='POST'}"><form:errors path="indexNumber" /></c:if>
                </td>
            </tr>
            <tr>
                <th>Email</th>
                <td>
                    <form:input type="text" path="email" />
                    <c:if test="${pageContext.request.method=='POST'}"><form:errors path="email" /></c:if>
                </td>
            </tr>
            <tr>
                <td colspan="2" align="right"><input type="submit" value="Dodaj!" /></td>
            </tr>
            </tbody>
        </table>
    </form:form>

I tried adding ("userDto") next to @InitBinder, it didn't help unfortunately. Haven't found much more in terms of applicable solutions. If there's anything else I should post here let me know. I can also provide a link to repository should anyone be eager enough to try to run it.

Upvotes: 3

Views: 4389

Answers (1)

Darren Parker
Darren Parker

Reputation: 1812

I think you need to change the supports method in UserValidator to UserDTO class:

public boolean supports(Class<?> clazz) {
     return UserDTO.class.equals(clazz);
}

Upvotes: 1

Related Questions