代码之家  ›  专栏  ›  技术社区  ›  italktothewind

Spring验证:使用两个验证器时获取“验证器的无效目标”

  •  0
  • italktothewind  · 技术社区  · 7 年前

    控制器代码:

    @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){
        //...
    }
    

    会话验证程序:

    @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){
            //...
        }
    }
    

    通道验证器:

    @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){
            //...
        }
    }
    

    我在调用控制器时收到以下异常:

    Caused by: java.lang.IllegalStateException: Invalid target for Validator [com.almundo.p13n.dna.validators.ChannelValidator@4e642ee1]: Session(null, null)
    

    有人知道怎么解决吗?提前谢谢!

    1 回复  |  直到 7 年前
        1
  •  2
  •   davidxxx    7 年前

    您绑定了两个验证器,但对于每个要验证的参数,只支持其中一个验证器。
    SessionValidator Session Channel 参数和反向 ChannelValidator 支持 渠道 参数,但不支持 会议 参数。
    但是例外。

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

    你当然应该登记一下 validate() 并且仅当它与验证器类匹配时才执行验证。

    javax.validation.ConstraintValidator 通过在控制器中显式地验证参数来验证每个类。

    作为第三种选择,如果有意义,可以直接在 以及 渠道 上课。所以,你仍然可以使用 @Valid 在参数声明中保持自动验证。