0

I'm using a combination of Annotation validation and a Custom Validator

Object:

@Entity
@Table(name = "monitoringsystems")
public class MonitoringSystem {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@NotNull(message = "Name must not be empty.")@Size(min=1, message="Name must not be empty.")
private String name;
@NotNull(message = "URL must not be empty.")@Size(min=1, message="Name must not be empty.")
private String url;
@NotNull(message = "Username must not be empty.")@Size(min=1, message="Name must not be empty.")
private String username;
@NotNull(message = "Password must not be empty.")@Size(min=1, message="Name must not be empty.")
private String password;
@NotNull(message = "Confirm Password must not be empty.")@Size(min=1, message="Name must not be empty.")
@Transient
private String passwordConfirm;

CustomValidator:

@Component
public class MonitoringSystemValidator implements Validator {

@Override
public boolean supports(Class<?> type) {
    return MonitoringSystem.class.isAssignableFrom(type);
}

@Override
public void validate(Object o, Errors errors) {
    MonitoringSystem monitoringSystem = (MonitoringSystem) o;
    if(!monitoringSystem.getPassword().equals(monitoringSystem.getPasswordConfirm())){
        errors.rejectValue("passwordConfirm", "Passwords are not equal.");
    }
}  

}

I initialize the custom validator in my controller and set the mapping for the form and the saving method.

Controller:

@Controller
public class MonitoringSystemController {

@Autowired
private MonitoringSystemValidator monitoringSystemValidator;

@InitBinder
public void dataBinding(WebDataBinder binder) {
    binder.addValidators(monitoringSystemValidator);
}

@RequestMapping("/monitoringsystem/new")
public String newMonitoringSystem(Model model, HttpServletRequest request) {
    MonitoringSystem monitoringSystem = new MonitoringSystem();
    model.addAttribute("monitoringSystem", monitoringSystem);
    request.getSession().setAttribute("anonymization", monitoringSystem.getAnonymization());
    request.getSession().setAttribute("hosts", monitoringSystem.getHosts());

    return "monitoringsystem/form";
}

@RequestMapping(value = "/monitoringsystem/save", method = RequestMethod.POST)
public String save(@Valid MonitoringSystem monitoringSystem, BindingResult result, HttpServletRequest request, Model model) {

    if(result.hasErrors()){
        model.addAttribute("monitoringSystem", monitoringSystem);
        request.getSession().setAttribute("anonymization", request.getSession().getAttribute("anonymization"));
        request.getSession().setAttribute("hosts", request.getSession().getAttribute("hosts"));        
        return "monitoringsystem/form";
    }

//more code

In a first step I only want to change the CSS of my fields (I use bootstrap) so display the errors.

Form:

<form class="form-horizontal" th:modelAttribute="monitoringSystem" th:object="${monitoringSystem}" th:action="@{/monitoringsystem/save}" method="post">
            <input type="hidden" th:field="*{id}"/>
            <fieldset>
                <legend>New Monitoring-System</legend>
                <div class="form-group" th:classappend="${#fields.hasErrors('name')} ?: 'has-error has-danger'">
                    <label class="col-md-4 control-label" for="textinput">Systemname</label>  
                    <div class="col-md-5">
                        <input th:field="*{name}" class="form-control input-md" type="text" /> 
                    </div>
                </div>
                <div class="form-group" th:classappend="${#fields.hasErrors('url')} ?: 'has-error has-danger'">
                    <label class="col-md-4 control-label" for="textinput">URL</label>  
                    <div class="col-md-5">
                        <input th:field="*{url}" class="form-control input-md" type="text" /> 
                    </div>
                </div>
                <div class="form-group" th:classappend="${#fields.hasErrors('username')} ?: 'has-error has-danger'">
                    <label class="col-md-4 control-label" for="textinput">Username</label>  
                    <div class="col-md-5">
                        <input th:field="*{username}" class="form-control input-md" type="text" />
                    </div>
                </div>
                <div class="form-group" th:classappend="${#fields.hasErrors('password')} ?: 'has-error has-danger'">
                    <label class="col-md-4 control-label" for="textinput">Password</label>  
                    <div class="col-md-5">
                        <input th:field="*{password}" class="form-control input-md" type="password" />
                    </div>
                </div>
                <div class="form-group" th:classappend="${#fields.hasErrors('passwordConfirm')} ?: 'has-error has-danger'">
                    <label class="col-md-4 control-label" for="textinput">Confirm Password</label>  
                    <div class="col-md-5">
                        <input th:field="*{passwordConfirm}" class="form-control input-md" type="password" />
                    </div>
                </div>
                <div class="form-group">
                    <label class="col-md-4 control-label" for="singlebutton"></label>
                    <div class="col-md-4">
                        <a th:href="@{/monitoringsystem}" class="btn btn-default btn-small">Cancel</a> <button id="singlebutton" name="singlebutton" class="btn btn-primary btn-small">Submit</button>
                    </div>
                </div>
            </fieldset>
        </form>

My validation is working correctly. The form is only saved if my fields are not null, the size is greater 1 and the password match. If not, my controller redirects me to the form.

The problem is, that my css don't change. So there must be a problem with my view-code or the errorBinding is not passed correctly to the view. But I can't find my mistake.

1 Answer 1

0

There was an error in my if condition which add the errorclasses. I had to change ${#fields.hasErrors('url')} ?: 'has-error has-danger' to ${#fields.hasErrors('*{name}')} ? 'has-error has-danger'

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.