自定义验证器和@Validate

时间:2018-09-13 20:01:54

标签: java spring validation

我将向您展示一些代码,然后问一个问题。

AccountValidator.java

package com.goode.validator;

import com.goode.business.Account;

import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

@Component
public class AccountValidator implements Validator {

  @Override
  public boolean supports(Class clazz) {
    return Account.class.equals(clazz);
  }

  @Override
  public void validate(Object target, Errors errors) {
    Account account = (Account) target;

    if(account.getUsername() == null || account.getUsername().isEmpty()) {
      errors.rejectValue("username", "empty username");
    }

  }

  public void validateId(Object target, Errors errors) {
    Account account = (Account) target;

    if(account.getId() == 1) {
      errors.rejectValue("id", "bad ID");
    }

  }
}

AccountController.java

@RestController
@RequestMapping("/account")
public class AccountController extends BaseController<Account, AccountService> {

  @Autowired
  private AccountService accountService;

  @Autowired
  private AccountValidator accountValidator;

  @InitBinder
  protected void initBinder(final WebDataBinder binder)
  {
    binder.addValidators(accountValidator);
  }

  @PostMapping("/register")
  public ResponseEntity<?> register(HttpServletRequest request, @Validated(Account.ValidationStepOne.class) @RequestBody Account account, BindingResult result) {
    super.initializeService(accountService);

    //accountValidator.validateId(account, result);

    if(result.hasErrors()){
      return ErrorMessage.send(result.getFieldError().getCode(), HttpStatus.BAD_REQUEST);
    }

    return new ResponseEntity<>(null, HttpStatus.OK);
  }

Account.java 中,我有一些验证器,例如@NotNull-> @Validate为我检查字段->完美。 但是现在我想添加一些自定义验证器,因此我创建了 AccountValidator ,然后对 validate 方法进行了一些验证,并创建了@InitBinder->如果 username 为空或为空,此结果将向我显示错误->效果很好。 但是我创建了另一个验证方法- validateId 。如果我取消注释此行:

accountValidator.validateId(account, result);

验证器会很好地工作,结果将显示错误,但是可以使用@InitBinder进行某些操作来避免使用 validateId 方法吗?我想像验证方法一样自动调用 validateId 。有可能吗?

程序员的快乐日。

1 个答案:

答案 0 :(得分:0)

如果您想自动启用validateId,则应在validate方法内调用validateId。

@Override
public void validate(Object target, Errors errors) {
   Account account = (Account) target;

   if(account.getUsername() == null || account.getUsername().isEmpty()) {
    errors.rejectValue("username", "empty username");
   }
  validateId(account, errors);
}