java - 为 Spring 验证框架定制 validator

标签 java spring spring-boot validation

我有一个应用程序级服务如下:

@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)。

我的问题是我可以为特定参数提供自定义 validator 吗?例如,我有一个实现 org.springframework.validation.Validator 的 CreateDatasetCommandValidator ,我想在调用该方法之前触发此 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) {
    ...
  }
}

最佳答案

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

@InitBinder(value="user")
public void anyName(WebDataBinder binder){
binder.xxx()
}
  • Autowiring validator 。
  • 将 validator 添加到 InitBinder。
  • 将@Valid注释应用于具体 Controller 中的模型。

关于java - 为 Spring 验证框架定制 validator ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58152901/

相关文章:

Windows 10 上的 java.lang.NoClassDefFoundError : Could not initialize class org. Rocksdb.Options

xml - 简单类型的 Spring 构造函数参数歧义

spring - 在 web.xml 中将 BasicDataSource 配置为 bean

Spring Boot - 动态更改连接

Java创建多个对象

java - 如何保留 $in 查询的光标顺序?

java - 为什么 `setConnectionRequestTimeout` 没有停止我的 1 分钟获取请求?

java - 如何在不影响原始元素的情况下更改 It's duplicate 中的 ArrayList 元素?

mysql - Spring Boot MySQL REST 错误 - 需要一个名为 'entityManagerFactory'/'emf' 的 bean,但无法找到

java - 使用 Thymeleaf 发布具有多对一关系的数据