Tony
Tony

Reputation: 3805

JSP and Spring Validation

This is my BackupForm:

public class BackupForm {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }   


}

This is validator:

@Component
public class BackupFormValidator implements Validator {

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


    public void validate(Object target, Errors errors) {
        BackupForm backupForm = (BackupForm) target;

        if (backupForm.getName().length() == 0) {
            System.out.println("Empty");
            errors.rejectValue("name", "name.empty", "Name field is empty.");
        } else {
            File file = new File(Configures.getDirectory() + "\\"
                    + backupForm.getName() + ".sql");
            if (file.exists()) {
                System.out.println("Exists");
                errors.rejectValue("name", "name.exist",
                        "File." + backupForm.getName() + ".sql already exists.");
            }
        }

    }
}

This is how I do in controller:

@RequestMapping(value = "/backup", method = RequestMethod.POST)
    public String backupProcess(
            @ModelAttribute("backup") BackupForm backupForm,
            BindingResult result, Map<String, Object> map) {

        backupFormValidator.validate(backupForm, result);
        if (result.hasErrors()) {
            // Если обнаружилась ошибка, то добавим в карту идентификатор об
            // ошибке и вернем логическое представление поиска
            map.put("error", true);
            map.put("backup", new BackupForm());
            map.put("search", new SearchForm());
            return "backup";

        } else {
            return "redirect:/";
        }

    }

It's works, but tag errors is not working:

<form:form method="POST" commandName="backup">
    <c:if test="${!empty error}">
        <div class="alert alert-danger">
            <b>Can not execute command!</b>
            <form:errors path="name" />
        </div>
    </c:if>

    <div class="panel panel-default">
        <div class="panel-heading">New backup</div>
        <div class="panel-body">    

            <table style="width: 100%; border-collapse: collapse;">
                <tbody>
                    <tr>
                        <td
                            style="vertical-align: top; width: 250px; letter-spacing: 0px; word-spacing: 0px;"><form:input
                                path="name" class="form-control input-sm" type="text"
                                placeholder="Enter backup name..." value="${name}" /></td>
                        <td
                            style="text-align: left; vertical-align: top; letter-spacing: 0px; word-spacing: 0px;">
                            &nbsp;&nbsp;&nbsp;<input class="btn btn-success btn-sm"
                            type="submit" value="Backup" />
                        </td>
                    </tr>
                </tbody>
            </table>

        </div>
    </div>
</form:form>

What's wrong? Validation works properly, but <form:errors path="name" /> doesn't return anything.

Upvotes: 0

Views: 192

Answers (1)

Shay Elkayam
Shay Elkayam

Reputation: 4158

You should remove the following line:

map.put("backup", new BackupForm());

This line is resetting the modelAttribute to a new one and thus the errors don't appear.

Upvotes: 1

Related Questions