弹簧控制器对@ModelAttribute对象进行双重验证



我已经用方法实现了控制器:

public Page<EventDto> search(@ModelAttribute @Valid EventsCriteria criteria){...}

它有效。EventsCriteria本身没有特殊的单独验证器,因为它有像@NotNull@NotEmpty这样的内部注释检查器。现在情况发生了变化,只有这个验证器是不够的。所以我添加并注册了相应的服务来验证一些卫星。

我希望服务像以前一样验证其他复合案例和单一验证。但是像@NotNull@NotEmpty这样的单一内部注释检查器不再起作用了。

我是否配置不正确或无法同时工作(指定的服务和内部检查器)?

我的验证器示例(正如评论中要求的那样)

没有什么特别的,如果你知道春天,所以我错过了这部分,就像不重要一样,把你的注意力集中在我的问题上。

@Component
public class EventsCriteriaValidator implements Validator {
public static final String INVALID_RAGE_PARAMETERS_SPECIFIED = "Invalid rage parameters: please specify " +
"'from' and 'to' or page 'size";
@Override
public boolean supports(Class<?> clazz) {
return clazz.isAssignableFrom(EventsCriteria.class);
}
@Override
public void validate(Object target, Errors errors) {
EventsCriteria toValidate = (EventsCriteria) target;
validateComplexRestriction(toValidate, errors);
}
private void validateComplexRestriction(EventsCriteria toValidate, Errors errors) {
if (toValidate.isRangeEmpty() && toValidate.getSize() == 0) {
errors.rejectValue(SIZE_FIELD, null, INVALID_RAGE_PARAMETERS_SPECIFIED);
}
}
}

假设您的 EventsCriteria 包含两个字段,因此在您的验证方法中,您可以使用以下方法验证这些字段: ValidationUtils (org.springframework.validation.ValidationUtils)

@Override
public void validate(Object target, Errors errors) {
EventsCriteria eventsCriteria= (EventsCriteria) target;
ValidationUtils.rejectIfEmpty(errors, "field1", "eventsCriteria.field1.empty");
ValidationUtils.rejectIfEmpty(errors, "field2", "eventsCriteria.field2.empty");
}

和在您的消息中。

eventsCriteria.field1.empty = Enter a valid value for field 1.
eventsCriteria.field2.empty = Enter a valid value for field 2.

并在您的配置类中添加此 bean:

@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
source.setBasename("messages");
return source;
}

只需使Validator扩展LocalValidatorFactoryBean,然后在验证方法中调用super.validate(target, errors),如下所示:

@Override
public void validate(Object target, Errors errors) {
super.validate(target, errors);
EventsCriteria toValidate = (EventsCriteria) target;
validateComplexRestriction(toValidate, errors);
}

已编辑:

如果需要自定义和默认验证,则可以在 中使用addValidatorsinitBinder添加自定义验证。这样就不会删除默认验证。

@Controller
public class MyController
{
@Autowired
private EventsCriteriaValidator validator;
@InitBinder
protected void initBinder(final WebDataBinder binder)
{
binder.addValidators(validator);
}
public Page<EventDto> search(@ModelAttribute @Valid EventsCriteria   criteria, BindingResult result){
if (result.hasErrors()) {
// validation failed
} else {
//validation passed   
}
}
}

相关内容

  • 没有找到相关文章

最新更新