【问题标题】:Can I Autowired one Repository inside Spring boot custom validator我可以在 Spring Boot 自定义验证器中自动装配一个存储库吗
【发布时间】:2016-04-02 01:27:24
【问题描述】:

我使用 Spring Boot 创建了一个自定义验证器:

public class AberturaMatriculaValidator implements Validator {
    @Autowired
    IQualificacao iQualificacao;
    @Override
    public boolean supports(Class<?> clazz) {
        return AberturaMatricula.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {//TODO Necessita Validações mais complexas, como verificar se o valor existe em uma determinada lista e tal.
        AberturaMatricula obj = (AberturaMatricula) target;
        List<TbQualificacao> qualificacaoList = iQualificacao.findByNatureza("IMOVEIS");
        System.out.println(qualificacaoList.size());
    }
}

并将他添加到我的控制器中:

@RestController
            @RequestMapping("/ri")
            public class RIController {
            @InitBinder("aberturaMatricula")
                protected void initAberturaMatriculaBinder(WebDataBinder binder) {
                    binder.addValidators(new AberturaMatriculaValidator());
                }

            @RequestMapping(value =  "/selo/abertura/", method = RequestMethod.POST)
                public AberturaMatricula selarAbertura(@RequestBody @Valid AberturaMatricula aberturaMatricula){
            ...
             }
            }

所以在我的验证器中

@Autowired
IQualificacao iQualificacao;

不工作,如果我把这个存储库放在我的控制器中,工作正常

---------解决方案(@sanluck 的 tks)---------

我的验证者:

public class AberturaMatriculaValidator implements Validator {

    private IQualificacao iQualificacao;

    public AberturaMatriculaValidator(IQualificacao iQualificacao) {
        this.iQualificacao = iQualificacao;
    }

    @Override
    public boolean supports(Class<?> clazz) {

        return AberturaMatricula.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {//TODO Necessita Validações mais complexas, como verificar se o valor existe em uma determinada lista e tal.
        AberturaMatricula obj = (AberturaMatricula) target;

    }
}

在我的控制器中:

@RestController
@RequestMapping("/ri")
public class RIController {

    @Autowired
    IQualificacao iQualificacao;

    @InitBinder("aberturaMatricula")
    protected void initAberturaMatriculaBinder(WebDataBinder binder) {
        binder.addValidators(new AberturaMatriculaValidator(iQualificacao));
    }
...
}

【问题讨论】:

  • IoC 仅适用于 Spring 管理的 bean。您的自定义验证器不是一个。
  • 那么,当我需要进入数据库时​​,如何验证一些值?我试图在我的控制器中自动连接验证器,但没有成功
  • 需要在Spring中注册验证器。检查this。在此之后,您应该能够在验证器中自动装配东西。
  • @damobros 是的,但我需要知道这是哪里来的。例如我的基类,如果字段在对象内的对象中,我需要知道基类,我该怎么做?

标签: java spring-boot


【解决方案1】:

@Configuration添加到您的申请中以注册您的AberturaMatriculaValidator

@Configuration
public class ValidationConfig {

@Autowired
IQualificacao iQualificacao;

@Bean
public AberturaMatriculaValidator aberturaMatriculaValidator() {
    return new AberturaMatriculaValidator(iQualificacao);
}
}

您还必须创建构造函数AberturaMatriculaValidator(IQualificacao iqualificao)

【讨论】:

  • 但是在这里? @InitBinder("aberturaMatricula") protected void initAberturaMatriculaBinder(WebDataBinder binder) { binder.addValidators(new AberturaMatriculaValidator()); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
相关资源
最近更新 更多