微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring Boot:为什么Custom Validator类中的自动装配对象为null?

如何解决Spring Boot:为什么Custom Validator类中的自动装配对象为null?

以下代码在isValid()函数内的teamResource自动连接对象上产生null:

@Component //I am not sure it is required he
public class TeamIdValidator implements ConstraintValidator<TeamIdConstraint,Integer> {
    
    @Autowired private TeamResource teamResource;
    
    public TeamIdValidator() {
    }

    @Override
    public void initialize(TeamIdConstraint teamIdConstraint) {
        // this.teamIdConstraint = teamIdConstraint;
    }

    @Override
    public boolean isValid(Integer teamId,ConstraintValidatorContext cxt) {

        int numOfAvailableTeams = teamResource.retrieveAllTeams().size(); //teamResource is null :(

        return teamId < 0 || teamId >= numOfAvailableTeams;
    }
}

TeamResource类:

@RestController
@CrossOrigin
public class TeamResource {
    
    @Autowired private TeamRepository teamRepository;
    
    public TeamResource() {
    }
    ...

   //mapping methods
}

如果有关系...

@Documented
@Constraint(validatedBy = TeamIdValidator.class)
@Target({ ElementType.METHOD,ElementType.FIELD,ElementType.ParaMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface TeamIdConstraint {
    
    String message() default "Invalid team id!";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

为什么地球上的TeamResource为null?

未在其他任何地方使用新的显式初始化它。

解决方法

已经在注释中提及,但是声明了一个像这样的bean

@Configuration
public class ValidationConfig{

    @Bean
    public LocalValidatorFactoryBean validator() {
        return new LocalValidatorFactoryBean();
    }

    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor(Validator validator) {
        MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
        methodValidationPostProcessor.setValidator(validator);
        return methodValidationPostProcessor;
    }

}

删除所有@autowired,最好使用构造函数注入。 (检查互联网原因)。

然后,将RestContoller注入验证器没有任何意义。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。