自定义验证器设置

我正在重新开发现有代码,该代码已实现了自定义验证器(DateRangeValidator),负责验证订阅日期。 我的工作是替换@RequestParam值:limit,page,... with POJO's: PagingCriteriaSortCriteria,用作分页和排序参数。 它可以在代码的其他部分正常工作,但在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"

问题是,此验证器尝试验证我的类(PagingCrititeriaSortCriteria)并返回异常(DataBinder.assertValidators抛出异常)。

如何设置DateRangeValidator自定义验证器以对PagingCriteriaSortCriteria使用通用的弹簧验证?

下面的代码段。

从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() {
    }
wangxd925 回答:自定义验证器设置

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3166082.html

大家都在问