Пользовательский валидатор и @Validate - PullRequest
0 голосов
/ 13 сентября 2018

Я покажу вам код, а затем задам вопрос.

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 это результат покажет мне ошибку -> это работает хорошо. Но я создал другой метод проверки - validateId . Если я раскомментирую эту строку:

accountValidator.validateId(account, result);

валидатор будет работать хорошо, и результат покажет ошибку, но возможно ли что-то сделать с @InitBinder, чтобы избежать использования validateId метода? Я хотел бы вызвать validateId автоматически как метод validate. Возможно ли это?

С Днем Программиста.

1 Ответ

0 голосов
/ 14 октября 2018

Если вы хотите использовать validateId автоматически, вы должны вызвать validateId внутри метода validate.

@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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...