自定义spring验证框架的验证器

时间:2019-09-29 06:37:24

标签: java spring spring-boot validation

我下面有一个Application Level Service

@Service
public class DatasetApplicationService {

  private DatasetRepository datasetRepository;

  @Autowired
  public DatasetApplicationService(DatasetRepository datasetRepository) {
    this.datasetRepository = datasetRepository;
  }

  @Transactional
  public Dataset createDataset(@Valid CreateDatasetCommand newDatasetParams) {
    ...
  }
}

查看方法DatasetApplicationService.createDataset,会向其发送带有注释CreateDatasetCommand的参数@Valid。调用该方法时,可以触发注释以验证CreateDatasetCommand(请参见spring boot bean validation)。

我的问题是我可以为特定参数提供定制的验证器吗?例如,我有一个CreateDatasetCommandValidator,它实现了org.springframework.validation.Validator,我想在调用该方法之前触发此验证器。


我对InitBinder做过一些研究,但似乎没有在此过程中触发,失败的例子是:

@Service
public class DatasetApplicationService {

  private DatasetRepository datasetRepository;
  private CreateDatasetCommandValidator validator;

  @InitBinder // <----- this is not triggered
  protected void initBinder(DataBinder binder) {
    binder.setValidator(validator);
  }

  @Autowired
  public DatasetApplicationService(DatasetRepository datasetRepository,
                                   CreateDatasetCommandValidator validator) {
    this.datasetRepository = datasetRepository;
    this.validator = validator;
  }

  @Transactional
  public Dataset createDataset(@Valid CreateDatasetCommand newDatasetParams) {
    ...
  }
}

1 个答案:

答案 0 :(得分:1)

Controller收到的每个请求,都会调用@InitBinder方法,以避免为我们在其中定义值的每个请求调用。

@InitBinder(value="user")
public void anyName(WebDataBinder binder){
binder.xxx()
}
  • 验证器的自动装配。
  • 将验证器添加到InitBinder。
  • 将@Valid注释应用于具体控制器中的模型。