我正在重新开发现有代码,该代码已实现了自定义验证器(DateRangeValidator),负责验证订阅日期。
我的工作是替换@RequestParam
值:limit,page,... with POJO's:
PagingCriteria
和SortCriteria
,用作分页和排序参数。
它可以在代码的其他部分正常工作,但在jUnit测试中可以得到这种情况:"org.springframework.web.util.nestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: Invalid target for Validator [xyt.time.DateRangeValidator@25b07ed1]: xyt.rest.PagingCriteria@2ecbb9fa"
问题是,此验证器尝试验证我的类(PagingCrititeria
和SortCriteria
)并返回异常(DataBinder.assertValidators
抛出异常)。
如何设置DateRangeValidator
自定义验证器以对PagingCriteria
和SortCriteria
使用通用的弹簧验证?
下面的代码段。
从PagingCriteria中删除@Valid注释-不起作用。
控制器:
@RestController
@RequestMapping(path = "/subscriptions")
public class UserSubscriptionController {
@Value("${page.limit.max:1000}")
private int maxPageSize;
@Autowired
private SomeService someService;
@InitBinder
protected void initBinder(final WebdataBinder binder) {
binder.addValidators(new DateRangeValidator());
}
@GetMapping(path = "/users")
public Page<UserSubscription> listAll(final @Valid PagingCriteria pagingCriteria,final SortCriteria sortCriteria) {
return someService.findAll(pagingCriteria,sortCriteria);
}
@PostMapping(value = "/{subscriptionId}/users/{userId}/entitledRanges")
@ResponseStatus(HttpStatus.CREATED)
public Collection<DateRangeImpl> addEntitledRange(@PathVariable final UUID userId,@PathVariable final UUID subscriptionId,@Valid @RequestBody @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) final DateRangeImpl range) {
return someService.addEntitledRange(userId,subscriptionId,range);
}
DataBinder(春季定制类):
private void assertValidators(Validator... validators) {
Object target = getTarget();
for (Validator validator : validators) {
if (validator != null && (target != null && !validator.supports(target.getclass()))) {
throw new IllegalStateException("Invalid target for Validator [" + validator + "]: " + target);
}
}
}
public void addValidators(Validator... validators) {
assertValidators(validators);
this.validators.addAll(Arrays.asList(validators));
}
DateRangeValidator:
public class DateRangeValidator implements Validator {
@Override
public boolean supports(final Class<?> clazz) {
return DateRange.class.isAssignableFrom(clazz);
}
@Override
public void validate(final Object target,final Errors errors) {
final DateRange range = (DateRange) target;
if (range.getStartDate() != null && range.getEndDate() != null && range.getEndDate().isBefore(range.getStartDate())) {
errors.rejectvalue("endDate","invalid.range","End date has to be set after start date");
}
}
DataBinder(春季定制类):
private void assertValidators(Validator... validators) {
Object target = getTarget();
for (Validator validator : validators) {
if (validator != null && (target != null && !validator.supports(target.getclass()))) {
throw new IllegalStateException("Invalid target for Validator [" + validator + "]: " + target);
}
}
}
public void addValidators(Validator... validators) {
assertValidators(validators);
this.validators.addAll(Arrays.asList(validators));
}
PagingCriteria:
public class PagingCriteria {
enter code here
@Min(value = 0)
private int page = 0;
@Min(value = 0)
private int limit = 20;
public PagingCriteria() {
}