我有一个自定义批注,用于验证客户端对通过 Dropwizard 开发的应用程序的请求。注释看起来像-
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = FreshContentIdValidator.class)
public @interface FreshContentId {
String message() default "interest id already taken";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
,由于我们可以在我们的写入路径上执行大量操作,因此我们在FreshContentIdValidator
内验证了String contentId
在数据库中的存在。反过来,它使用了一些服务及其实现-
public class FreshContentIdValidator implements ConstraintValidator<FreshContentId, String> {
private FreshContentId freshContentId;
private ContentManagementService contentManagementService;
@Override
public void initialize(FreshContentId freshContentId) {
this.freshContentId = freshContentId;
contentManagementService = com.google.inject.Injector.getInstance(ContentManagementService.class);
}
@Override
public boolean isValid(String contentId, ConstraintValidatorContext context) {
context.disableDefaultConstraintViolation();
// perform validations using contentManagementService
context.buildConstraintViolationWithTemplate("").addConstraintViolation();
return true/false;
}
}
现在,我正在提取请求-响应模型以与客户端共享这些模型,但是我有一个疑问,就是以某种方式将这行代码去耦以在应用程序层绑定验证器是否可行只有吗?
@Constraint(validatedBy = FreshContentIdValidator.class)
当然,我正在寻找这种可能性,因为这将需要最少的代码更改量和遗留代码的迁移痛苦,因为您可以观察到上面共享的实现。 (换句话说,从自定义验证批注中删除此行使在客户端之间共享变得容易,但实际上并未验证内容。)