Spring 验证 : getting "Invalid target for Validator" when using two validators

标签 spring spring-mvc spring-boot custom-validators

我在使用 @InitBinder 注释实现两个验证器时遇到问题。

Controller 代码:

@Autowired
private SessionValidator sessionValidator;

@Autowired
private ChannelValidator channelValidator;

@InitBinder
public void initBinder(WebDataBinder binder){
    binder.addValidators(sessionValidator, channelValidator);
}

@RequestMapping(method = RequestMethod.GET)
public UserInfo findBySession(
        @Valid @ModelAttribute Session session,
        @Valid @ModelAttribute Channel channel){
    //...
}

session 验证器:
@Component
public class SessionValidator implements Validator {

    @Override
    public boolean supports(Class<?> aClass){
        return Session.class.equals(aClass);
    }

    @Override
    public void validate(Object o, Errors errors){
        //...
    }
}

channel 验证器:
@Component
public class ChannelValidator implements Validator {

    @Override
    public boolean supports(Class<?> aClass){
        return Channel.class.equals(aClass);
    }

    @Override
    public void validate(Object o, Errors errors){
        //...
    }
}

调用 Controller 时收到以下异常:
Caused by: java.lang.IllegalStateException: Invalid target for Validator [com.almundo.p13n.dna.validators.ChannelValidator@4e642ee1]: Session(null, null)

任何人都知道如何解决它?提前致谢!

最佳答案

您绑定(bind)了两个验证器,但对于每个要验证的参数,仅支持其中一个。SessionValidator支持Session参数但不支持 Channel参数和反向ChannelValidator支持Channel参数但不支持 Session范围。
而异常(exception)。

作为第一种选择,您可以在每个 Spring Validator 子类中支持这两种参数类型。这有点笨拙,但应该可以:

@Override
public boolean supports(Class<?> aClass){
    return Channel.class.equals(aClass) ||  Session.class.equals(aClass);
}

您当然应该检查 validate() 中的类型并且仅当它与验证器类匹配时才执行验证。

作为第二种选择,通过实现 javax.validation.ConstraintValidator 使用标准验证 API为每个类验证并通过在 Controller 中显式验证参数。

作为第三种选择,如果有意义,您可以直接注释 Session 上的约束。和 Channel类。所以,你仍然可以使用 @Valid在参数声明中保持自动验证。

关于 Spring 验证 : getting "Invalid target for Validator" when using two validators,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51830519/

相关文章:

java - Hibernate:Hibernate 为 Fetch 模式 Eager 进行的多个选择查询

xml - 找不到类路径资源 [bean.xml] 中定义的名称为 'helloworld' 的 bean 的类 [com.springdemo]

spring - 使用 spring boot 配置多个 servletcontainers/servlet

spring-mvc - <global-method-security> 如何通过 Spring-Security 在我的 Controller 上工作?

java - 使用 thymeleaf 在 spring mvc 应用程序中从数据库生成 html 选择选项

java - Spring Boot如何在服务器重启时轮换日志文件

Spring Boot - Gradle 排除未反射(reflect)在 Gradle 缓存中

spring - 将参数从jsp传递到Spring Controller方法

java - Spring中不带@Configuration导入配置类

javascript - Spring Boot 无法识别 Javascript 文件