首页 > 解决方案 > 为 Spring 验证框架自定义验证器

问题描述

我有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) {
    ...
  }
}

标签: javaspringspring-bootvalidation

解决方案


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

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

推荐阅读