Всем привет! Решил разобраться с валидацией и прикрутить к своему учебному проекту проверку данных при регистрации пользователя.
Добавил в конфиг бин:
@Configuration
@ComponentScan("com.test.project")
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
...
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasenames("resources");
messageSource.setUseCodeAsDefaultMessage(true);
messageSource.setDefaultEncoding("UTF-8");
messageSource.setFallbackToSystemLocale(false);
return messageSource;
}
}
Создал в каталоге resources файл message.properties:
user.loginIsEmpty = Login is required.
user.login = Login must be between 8 and 16 characters.
user.duplicateLogin = Such login already exists.
user.passwordIsEmpty = Password is required.
user.password = Password must be over 8 characters.
user.confirmPasswordIsEmpty = Confirm password is required.
user.differentPassword = Password don't match.
Написал класс для валидации:
@Component
public class UserValidator implements Validator {
@Autowired
private UserService userService;
@Override
public boolean supports(Class<?> aClass) {
return User.class.equals(aClass);
}
@Override
public void validate(Object o, Errors errors) {
User user = (User) o;
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "login", "user.loginIsEmpty");
String login = user.getLogin();
String password = user.getPassword();
if (login.length() > 16 || login.length() < 8)
errors.rejectValue("login", "user.login");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "user.passwordIsEmpty");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "confirmPassword", "user.confirmPasswordIsEmpty");
if (password.length() < 8)
errors.rejectValue("password", "user.password");
if (!password.equals(user.getConfirmPassword()))
errors.rejectValue("confirmPassword", "user.differentPassword");
if (userService.getByLogin(login) != null)
errors.rejectValue("login", "user.duplicateLogin");
}
}
Добавил проверку на валидность в контроллер:
@Controller
public class RegController {
@Autowired
UserValidator userValidator ;
@Autowired
private SecurityService securityService;
@Autowired
private UserService userService;
@RequestMapping(value = "/reg", method = RequestMethod.GET)
public String signUp(Model model) {
model.addAttribute("user", new User());
return "reg";
}
@RequestMapping(value = "/reg", method = RequestMethod.POST)
public String signUp(@ModelAttribute("user") User user, BindingResult bindingResult, Model model) {
userValidator.validate(user, bindingResult);
if (!bindingResult.hasErrors()) {
userService.create(passenger);
return "/index";
}
else
return "/reg";
}
}
Добавил форму:
<form:form method="POST" modelAttribute="passenger">
<spring:bind path="login">
<div class="form-group ${status.error ? 'has-error' : ''}">
<form:input type="text" path="login" class="form-control" placeholder="Login"></form:input>
<form:errors path="login"></form:errors>
</div>
</spring:bind>
<spring:bind path="password">
<div class="form-group ${status.error ? 'has-error' : ''}">
<form:input type="password" path="password" class="form-control" placeholder="Password"></form:input>
<form:errors path="password"></form:errors>
</div>
</spring:bind>
<spring:bind path="confirmPassword">
<div class="form-group ${status.error ? 'has-error' : ''}">
<form:input type="password" path="confirmPassword" class="form-control" placeholder="Confirm your password"></form:input>
<form:errors path="confirmPassword"></form:errors>
</div>
</spring:bind>
<button type="submit">Submit</button>
</form:form>
Вроде все делал по туториалам, но, например, при пустом поле логина, на странице отобразится не "Login is required.", а "user.loginIsEmpty". И так со всеми полями.
Подскажите, где я ошибся?
При инициализации конфигурации Spring
нужно указать, откуда брать настройки оной:
@Configuration
@PropertySource(value = {"classpath:resources/message.properties"})
Но лучше указать абсолютный путь (например такой):
@Configuration
@PropertySource(value = {"file:/opt/common_resources/message.properties"})
После этого создаете бин, который будет читать информацию из файла:
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
Теперь можно объявлять переменные:
@Value("${user.loginIsEmpty}")
String loginIsEmpty;
@Value("${user.login}")
String login;
@Value("${user.duplicateLogin}")
String duplicateLogin;
@Value("${user.passwordIsEmpty}")
String password;
@Value("${user.confirmPasswordIsEmpty}")
String confirmPasswordIsEmpty;
@Value("${user.differentPassword}")
String differentPassword;
Или вот так еще можно:
@Bean
public MessageSource messageSource(
@Value("${user.loginIsEmpty}") String loginIsEmpty,
@Value("${user.login}") String login,
@Value("${user.duplicateLogin}") String duplicateLogin,
@Value("${user.passwordIsEmpty}") String password,
@Value("${user.confirmPasswordIsEmpty}") String confirmPasswordIsEmpty,
@Value("${user.differentPassword}") String differentPassword,
) {
// Работа с данными
// . . .
return messageSource;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Напишите стрелочную функцию, которая принимает объект, узнаёт сколько у него полей и методов, выводит все поляИ возвращает количество...
Почему select не правильно отобразился? Хотя он и там и там один и тот же