java - Spring Controller 对 @ModelAttribute 对象的双重验证

标签 java validation spring-mvc spring-config

我已经用方法实现了 Controller :

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

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

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

我是否配置了错误的内容或者它无法同时工作(指定服务和内部检查器)?

我的 validator 示例(正如评论中所要求的那样)

没有什么特别的,如果你了解 spring,所以我错过了这部分,因为你无法将注意力集中在我的问题上。

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

以及您的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;
   }

关于java - Spring Controller 对 @ModelAttribute 对象的双重验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47674693/

相关文章:

java - 验证txt文件

java - bean 定义文件的 FileNotFoundException 仅发生在网上,而不发生在本地主机上

java - Telegram API : How keep ApiState to save signIn state

javascript - 前端还是后端匹配密码?

ruby-on-rails - rails : how do I validate that something is a boolean?

spring-mvc - Spring MVC 中的单元测试错误 : context configuration file not found

java - 在 http 请求之间保留文件

java - 错误计数器

java - Eclipse 中光标前的矩形

没有服务器的 Java 持续集成