【问题标题】:Custom Validator and @Validate自定义验证器和@Validate
【发布时间】:2023-03-31 22:20:03
【问题描述】:

我会给你看一些代码,然后我会问一个问题。

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 -> if username为空或 null 此 result 将显示错误 -> 效果很好。 但我创建了另一个验证方法 - validateId。如果我取消注释这一行:

accountValidator.validateId(account, result);

validator 可以正常工作,结果会显示错误,但是否可以使用 @InitBinder 来避免使用 validateId 方法?我想像验证方法一样自动调用 validateId。有可能吗?

程序员节快乐。

【问题讨论】:

    标签: java spring validation


    【解决方案1】:

    如果你想自动验证Id,你应该在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);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-04-10
      • 2018-11-25
      • 1970-01-01
      • 2019-09-23
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      相关资源
      最近更新 更多