1

Glassfish 4 で Jersy 2 を使用しています。Bean パラメータを検証するために呼び出されるカスタム ConstraintValidator があります。

を使用ConstraintValidatorして、Jersey リソースが正しく注入され@Contextます。(@Context を @Inject に変更して、システムによって ConstraintValidator が 2 回呼び出されたときにリソースが null になる問題を解決しました。)

メソッドが 2 回呼び出される問題isValid()メソッドが呼び出される前に、ログが 2 回出力されていることがわかりますupdate()

デバッグ ロギングを行うためにインターセプターを追加しました。最初にconstraintvalidator.isValid()が呼び出され、次にInterceptorが呼び出され、次にconstraintvalidator.isValid()が再度呼び出され、次にRESTリソースメソッドのみが呼び出されます。

(このクラスには、注入されたリソースは含まれません。)

public class StudyValidator implements ConstraintValidator<StudyCheck, StudyBeanREST> {

  private static final Logger log = Logger.getLogger(StudyValidator.class);

  @Override
  public void initialize(StudyCheck constraintAnnotation) {
  }

  @Override
  public boolean isValid(StudyBeanREST study, ConstraintValidatorContext context) {
    log.info("Validating study: " + study);
    Integer version = study.getVersion();
    if(version == null || version < 0) {
      return false;
    }
    return true;
  }
}

注釈:

@Target({ElementType.PARAMETER,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {StudyValidator.class})
public @interface StudyCheck {
  String message() default "{error.version}";

  Class<?>[] groups() default {};

  Class<? extends Payload>[] payload() default {};
}

そして、注釈を使用する場所:

  @PUT
  @RolesAllowed({"management"})
  public StudyBeanREST update(@StudyCheck StudyBeanREST study) throws RecordNotFoundException, UpdateNotAllowedException {
    Study updated = studyEJB.update(study.getJpa());
    study.setJpa(updated);
    return study;
  }
4

0 に答える 0