在 Glassfish 4 上使用 Jersy 2。我有一个自定义 ConstraintValidator 被调用以验证 bean 参数。
使用ConstraintValidator
Jersey 资源正确注入@Context
. (将 @Context 更改为 @Inject 以解决系统调用 ConstraintValidator 两次时资源为空的问题。)
问题该isValid()
方法被调用两次我可以看到在调用该方法之前记录被打印两次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;
}