【问题标题】:Spring invalid target for Validator验证器的 Spring 无效目标
【发布时间】:2021-03-18 19:02:23
【问题描述】:

我正在尝试验证字符串 email 以检查它是否已出现在我的 MYSQL 数据库中,当我使用已使用的电子邮件执行时,我收到以下错误:

java.lang.IllegalStateException:Validator [co2103.hw2.controller.TestResultsValidator@62b41c6] 的目标无效:org.springframework.validation.BeanPropertyBindingResult:1 个错误 字段“电子邮件”上的对象“testResults”中的字段错误:拒绝值 [abc@le.ac.uk];代码 [email.testResults.email,email.email,email.java.lang.String,email];论据 [];默认消息 [已由其他用户提供!请使用另一个!]

这是验证器代码

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";
}}

【问题讨论】:

    标签: java spring validation jsp


    【解决方案1】:

    你需要将你的验证器注册到 spring。

    验证器的第一个广告组件注释。

    @Component
    public class TestResultsValidator implements Validator{
    .....
    }
    

    在控制器中注册。

    @Controller
    class TestResultController {
        @Autowired
        TestResultsValidator testResultsValidator ;
    
        @InitBinder("testResultsValidator")
        protected void initMessageBinder(WebDataBinder binder) {
            binder.addValidators(testResultsValidator );
        }
    }
    

    【讨论】:

    • 您好,感谢您的回复,当我现在这样做时,即使存在错误(即电子邮件已经存在),表单也会添加数据
    • 你检查验证器是否被执行了吗?
    • 我不确定验证器是否正在执行,我尝试过使用打印语句。您知道如何确保验证器正在执行吗?
    • 打印声明没问题。只需在 TestResults tr = (TestResults) 目标之前添加另一个打印语句;行。
    • 是的,我在你说的那行上面有一个打印声明,它没有打印。
    猜你喜欢
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 2014-03-01
    • 2015-11-10
    • 1970-01-01
    • 2015-11-10
    • 2017-10-27
    • 2021-02-22
    相关资源
    最近更新 更多