Использование валидатора JSR-303 вместо Spring Validator

У меня есть очень наивный концептуальный вопрос здесь для разъяснения. В моем приложении я в настоящее время использую JSR 303 Hibernate Validator для проверки модели домена с помощью @NotBlank и @NotNull аннотаций, таких как проверка имени пользователя, пароля и т.д.

public class Admin {

  private Long id;
  @NotBlank(message = "Username should not be null")
  private String username;
  @NotBlank(message = "Username should not be null")
  private String password;
  ...

Но для проверки логики домена, такой как существующее имя пользователя, я все еще использую Spring интерфейс Validator

@Component
public class AdminValidator implements Validator {
  ...
  @Override
  public void validate(Object target, Errors errors) {
    Admin admin = (Admin) target;
    if (usernameAlradyExist())){
        errors.rejectValue("username", null, "This user already exist in the system.");
    }

}

В контроллере я использую оба

@RequestMapping(value = "/register", method = RequestMethod.POST)
public String register(@Valid @ModelAttribute("admin") Admin admin, BindingResult bindingResult,) {
    validator.validate(admin, bindingResult);
    if (bindingResult.hasErrors()) {
        return REGISTER_ADMIN.getViewName();

    }

Возможно ли использовать Hibernate Validator и вообще не использовать Spring Validator для проверки логики домена?

Ответ 1

Да, вы можете использовать проверку JSR для проверки вашей логики домена. Вы должны определить аннотации пользовательских ограничений и определить свою логику проверки домена внутри нее.
Как
Определение аннотации пользовательских ограничений UserExistsConstraint

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy=UserExistsConstraintValidator.class)

public @interface UserExistsConstraint {
 String message() default "This user already exist in the system.";
 Class<!--?-->[] groups() default {};
 Class<!--? extends Payload-->[] payload() default {};
}   

Определение валидатора для пользовательской аннотации.

public class UserExistsConstraintValidator implements ConstraintValidator<UserExistsConstraint, object=""> {

 @Override
 public void initialize(UserExistsConstraint constraint) {

 }

 @Override
 public boolean isValid(Object target, ConstraintValidatorContext context) {
   if (usernameAlradyExist())
   {    
     return false;
   }
   else
   {
     return true; 
   }    
 }
}

Использование пользовательской аннотации

public class Admin {

  private Long id;
  @NotBlank(message = "Username should not be null")
  @UserExistsConstraint
  private String username;
  @NotBlank(message = "Username should not be null")
  private String password;
  ...

Ответ 2

Если вы настраиваете Spring MVC с <mvc:annotation-driven/>, тогда он автоматически настроит JSR 303 валидатор, если какой-либо JSR 303 validator impl ( hibernate-validator, например) присутствует в пути к классам.

Или, если вы явно хотите настроить валидатор, вы можете сделать это:

<bean id="validator"
      class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

Это снова будет искать реализацию JSR 303 и использовать это как средство проверки.

Вы можете использовать его для проверки любого объекта формы @Valid, зарегистрировав глобальный валидатор следующим образом:

<mvc:annotation-driven validator="validator"/>