#java #spring #validation #jsp
#java #spring #проверка #jsp
Вопрос:
Я пытаюсь проверить строковое электронное письмо, чтобы проверить, отображается ли оно уже в моей базе данных MYSQL, при выполнении с уже использованным электронным письмом я получаю следующую ошибку:
java.lang.Исключение IllegalStateException: недопустимая цель для валидатора [co2103.hw2.controller.TestResultsValidator@62b41c6]: org.springframework.validation.BeanPropertyBindingResult: ошибка поля ошибок 1 в объекте ‘TestResults’ в поле ’email’: отклоненное значение [abc@le.ac.uk ]; коды [email.TestResults.email,email.email,email.java.lang.Строка, адрес электронной почты]; аргументы []; сообщение по умолчанию [уже предоставлено другим пользователем! Пожалуйста, используйте другой!]
Вот код валидатора
public class TestResultsValidator implements Validator{
private TestResultsRepository TrRepo;
private HomeTestRepository HTRepo;
public TestResultsValidator (TestResultsRepository TrRepo, HomeTestRepository HTRepo) {
this.TrRepo = TrRepo;
this.HTRepo = HTRepo;
}
@Override
public boolean supports(Class<?> clazz) {
return TestResults.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
TestResults tr = (TestResults) target;
for(TestResults t : TrRepo.findAll()) {
//SAME EMAIL
if (tr.getEmail().equals(t.getEmail())) {
errors.rejectValue("email", "email", "is already provided by a different user! Please user another one!");
System.out.println("Email is already taken by a different user, please try another username");
break;
}
Код контроллера
//Add new results
@RequestMapping(value = "/addResults",method = {RequestMethod.POST , RequestMethod.GET})
public String newHotel(@Valid @ModelAttribute TestResults results, BindingResult result, Model model) {
if (result.hasErrors()) {
model.addAttribute("errors", result);
return "start";
}
else {
trRepo.save(results);
return "Submitted";
}}
Ответ №1:
Вам необходимо зарегистрировать свой валидатор в spring.
Первая аннотация компонента ad к вашему валидатору.
@Component
public class TestResultsValidator implements Validator{
.....
}
Зарегистрируйте его в контроллере.
@Controller
class TestResultController {
@Autowired
TestResultsValidator testResultsValidator ;
@InitBinder("testResultsValidator")
protected void initMessageBinder(WebDataBinder binder) {
binder.addValidators(testResultsValidator );
}
}
Комментарии:
1. Здравствуйте, спасибо за ваш ответ, когда я делаю это сейчас, форма просто добавляет данные, даже если подразумевается ошибка (т. Е. Электронное письмо уже существует)
2. вы проверяли, выполняется ли валидатор?
3. Я не уверен, выполняется ли валидатор, я пробовал использовать операторы печати. Есть ли у вас какие-либо идеи, как я могу обеспечить выполнение валидатора?
4. оператор печати в порядке. Просто добавьте еще один оператор печати перед TestResults tr = (TestResults) target; строка.
5. да, у меня есть оператор печати над строкой, которую вы сказали, и она не печатается.