java - 为 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) {
...
}
}
解决方案
Controller 收到的每个请求,都会调用 @InitBinder 方法,以避免调用我们在其中定义值的每个请求。
@InitBinder(value="user")
public void anyName(WebDataBinder binder){
binder.xxx()
}
- 验证器的自动装配。
- 将验证器添加到 InitBinder。
- 将@Valid 注解应用于具体控制器中的模型。
推荐阅读
- .net - C++/CLI .Net 程序集不会在 LabVIEW 中加载。这是由于与 C++/CLI .Net 的根本不兼容还是会出现问题?
- python - 如何使用 seaborn 将一系列值映射到特定颜色?
- angularjs - Angularjs $http.get 返回 409 错误,同样适用于邮递员和 crul 命令
- scala - 使用 spark 解析具有多个行标签的 xml
- python - Google BigQuery 结果不显示
- c# - 如何在一个查询中获取具有角色的用户?
- java - 为什么我的爬虫得到错误的 HTML 代码?
- c# - 在图片框内动态创建点/正方形
- java - 尽管位于另一个线程中,但代码仍会引发 NetworkOnMainThread 异常
- mysql - 比较两个数据库表并显示更改的列名