@ModelAttribute对象

时间:2017-12-06 12:48:55

标签: java validation spring-mvc spring-config

我用方法实现了控制器:

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);
        }
    }

}

3 个答案:

答案 0 :(得分:1)

假设您的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");
    }

并在 messages.properties

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;
   }

答案 1 :(得分:0)

<强>编辑:

如果您想要自定义和默认验证,可以使用addValidators initBinder添加自定义验证。这样就不会删除默认验证。

@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   
     }
  }

}

答案 2 :(得分:0)

只需进行<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"> <script src="https://code.jquery.com/jquery-1.12.4.js"></script> <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> <SELECT id="select-date"> <option value="1">TODAY</option> <option value="2">TOMORROW</option> <option selected value="3">THIS WEEK</option> <option value="4">NEXT WEEK</option> <option value="5">THIS MONTH</option> <option value="6">NEXT MONTH</option> <option value="7">CHOOSE DATE</option> </SELECT> <div id="datepicker"></div>扩展Validator,然后在验证方法中调用LocalValidatorFactoryBean,如下所示:

super.validate(target, errors)