Jersey 1.9 和高级验证

Jersey 1.9 and advanced validation

我正在使用具有验证支持的 Jersey 1.9 并具有如下资源方法:

@POST
public Response createNewOozieTransformation(
    @FormDataParam("info") SomeInfo info,
    @FormDataParam("zippedResources") InputStream zippedResources) {

    ...
    Collection<Resource> resources = resourcesService.extractResources(zippedResources);

    //This needs to be validated
    RequestWithResources requestWithResources = new RequestWithResources(info, resources);

    someService.handle(requestWithResources);
}

我正在为 SomeInfo 使用 bean 验证,它的一些参数是例如@NotNull 一切正常。我也想验证 RequestWithResouces 但我不知道如何验证。请注意 SomeInfo 包含有关所需资源的动态信息,因此我需要整个 RequestWithResources 才能执行验证。

我的 RequestWithResources 在 class 级别上有自定义 @ValidateMandatoryResources 注释:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Constraint(validatedBy = ValidateMandatoryResources.ResourcesValidator.class)
public @interface ValidateMandatoryResources {

    ...

    class ResourcesValidator implements ConstraintValidator<ValidateMandatoryResources, RequestWithResources> {
        ...
    }
}

我尝试过但没有成功的方法:

  1. 创建了一个方法,它创建了 RequestWithResources 注释 @ValidateOnExecution。 - 未调用验证程序

  2. 由于 someService 被注入到控制器中,我试图在它的 handle(...) 中用 @Valid 注释 ReqeuestWithResources 参数 - 验证器未执行

  3. @InjectValidator控制器class和运行validate(requestWithResources)就可以了。 - 因为无法注入 Validator

  4. 而死

您可以通过这种方式创建默认的 ValidatorFactory:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
Validator validator = factory.getValidator();

但是,您将在内存中拥有第二个 ValidatorFactory,因为它似乎无法获取由 jersey 实例化的那个。