Hi i am new to spring mvc validation framework.I am trying to implement a simple custom validator for the login form.
I did this way , but result.hasErrors() is always returning null and my control is moving to success page.
<form:form method="POST" action="/SampleWeb/logins" commandName="USER">
<table align="center" border="5" bordercolor="orange">
<tr>
<td style="color: white" align="center"><label>User Name</label></td>
<td><input name="userName" /></td>
</tr>
<tr>
<td style="color: white" align="center"><label>Password</label></td>
<td><input name="password" type="password"/></td>
</tr>
<tr>
<td colspan="2" style="color: white" align="center">
<input type="submit" value="Submit"/>
</td>
</tr>
</table>
<h3 align="center" style="color: red">${error}</h3>
</form:form>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:annotation-config />
<mvc:annotation-driven />
<context:component-scan base-package="com.sample.web.controller" />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="/WEB-INF/messages"/>
</bean>
</beans>
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
@Component
public class UsersValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return clazz.isAssignableFrom(users.class);
}
@Override
public void validate(Object obj, Errors errors) {
users user = (users) obj;
String userName = user.getUserName();
validateuserName(userName, errors);
}
private void validateuserName(String userName, Errors errors) {
if (isValidString(userName) && isNotBirminghamuserName(userName)) {
errors.rejectValue("userName", "UsersValidator.userName.notBirmingham",
"Not a b group user ");
}
}
private boolean isValidString(String str) {
return isNotNull(str) && (str.length() > 0);
}
private boolean isNotNull(String userName) {
return userName != null;
}
/** The first character of the Birmingham post code is 'B' */
private boolean isNotBirminghamuserName(String userName) {
char val = userName.charAt(0);
return val != 'B';
}
}
import javax.validation.Valid;
@Controller
public class LoginController {
@Autowired
private UsersValidator usersValidator;
final RequestHandler requestHandler = new RequestHandler();
@RequestMapping(value = "/login", method = RequestMethod.GET)
public ModelAndView login() {
return new ModelAndView("login", "users", new users());
}
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(usersValidator);
}
@RequestMapping(value = "/logins",method = RequestMethod.POST)
public ModelAndView validateUser(@Valid users user, BindingResult result,@ModelAttribute("USER")users users,RedirectAttributes redirectAttributes,ModelMap model) {
if (result.hasErrors()) {
model.addAttribute("error",
"No Errors This Time for postal code: " + user.getUserName());
}
return new ModelAndView("sample", model);
}
}
public class users implements Serializable {
private String userName;
private String password;
//getter setters
}
I mean validations in validator class are skipped and the control is directly going to success page. Can some one help me in this issue?
Try refactoring your validateUser
method so that it's the modelAttribute that gets validated.
@RequestMapping(value = "/logins",method = RequestMethod.POST)
public ModelAndView validateUser(@ModelAttribute("USER") @Valid users users, BindingResult result, RedirectAttributes redirectAttributes, ModelMap model) {
if (result.hasErrors()) {
model.addAttribute("error",
"No Errors This Time for postal code: " + user.getUserName());
}
return new ModelAndView("sample", model);
}
}