【发布时间】:2015-11-03 21:33:11
【问题描述】:
我正在使用带有验证支持的 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 在类级别上有自定义@ValidateMandatoryResources 注释:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Constraint(validatedBy = ValidateMandatoryResources.ResourcesValidator.class)
public @interface ValidateMandatoryResources {
...
class ResourcesValidator implements ConstraintValidator<ValidateMandatoryResources, RequestWithResources> {
...
}
}
我没有运气的尝试:
创建了一个方法,该方法创建带有
@ValidateOnExecution注释的RequestWithResources。 - 验证器没有被调用当
someService被注入控制器时,我尝试用@Valid注释handle(...)中的ReqeuestWithResources参数 - 验证器未执行@InjectValidator进入控制器类并在其上运行validate(requestWithResources)。 - 因为无法注入Validator而死去
【问题讨论】:
-
如果您启用 CDI,您的第三个选项将起作用。这当然取决于您未提及的 CDI 可用性的运行时环境。
-
很遗憾,我没有启用 CDI 的容器。我希望 Jersey 使用的 Validator 可以通过 HK2 获得。任何见解 Jersey 从哪里获取用于资源方法参数验证的验证器?
-
看来 jersey 正在为 BV 使用 hibernate impl。你可以这样创建一个默认的ValidatorFactory:ValidatorFactory factory = Validation.buildDefaultValidatorFactory();验证器验证器 = factory.getValidator();但是我不知道如何获得由 jersey 创建的那个
-
是的,正是这样做的。认为使用泽西的会更干净,但这可能是可以接受的。想要回答吗?