12

明確にするために、ここで非常に素朴な概念的な質問があります。私のアプリでは現在、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's 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 をまったく使用しないことは可能ですか?

4

2 に答える 2

18

はい、ドメイン ロジックの検証に JSR 検証を使用できます。カスタムの制約アノテーションを定義し、その中でドメイン ロジックの検証を定義する必要があります。 カスタム制約アノテーションの定義の
ように
UserExistsConstraint

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

public @interface UserExistsConstraint {
 String message() default "This user already exist's 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;
  ...
于 2012-07-08T09:25:53.313 に答える
2

Spring MVC を構成している場合、JSR 303 バリデーター impl (たとえば hibernate-validator) がクラスパスに存在すると、 JSR 303 バリデーター<mvc:annotation-driven/>が自動的に構成されます。

または、バリデーターを明示的に構成したい場合は、次のようにします。

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

これも JSR 303 実装を探し、それをバリデーターとして使用します。

この方法でグローバルバリデーターを登録することにより、デフォルトで @Valid フォームオブジェクトを検証することができます:

<mvc:annotation-driven validator="validator"/>
于 2012-07-07T22:10:16.437 に答える