这很简单。自从我写下示例以来,我将在这里粘贴示例,并且我很懒惰,不想带走您的有趣经历:)
编辑:我认为您的问题是您没有使用@Valid注释资源
所以我们开始:
您与验证者的关系正确。这些是我的:
public class CustomValidator implements ConstraintValidator<CustomValidation, String> { @Override public void initialize(CustomValidation constraintAnnotation) { } @Override public boolean isValid(String value, ConstraintValidatorContext context) { System.out.println("Validation called"); return false; }}这是注释:
@Constraint(validatedBy = {CustomValidator.class})@Target({ElementType.FIELD, ElementType.PARAMETER})@Retention(value = RetentionPolicy.RUNTIME)public @interface CustomValidation { String message() default "Some message"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {};}应用程序:
public class Application extends io.dropwizard.Application<Configuration>{ @Override public void run(Configuration configuration, Environment environment) throws Exception { MetricRegistry metrics = environment.metrics(); environment.jersey().register(new HelloResource(metrics)); } public static void main(String[] args) throws Exception { new Application().run("server", "/home/artur/dev/repo/sandbox/src/main/resources/config/test.yaml"); }}和资源:
@Path("/test")@Produces(MediaType.APPLICATION_JSON)@Consumes(MediaType.APPLICATION_JSON)public class HelloResource { private MetricRegistry service; public HelloResource(MetricRegistry service) { this.service = service; } @GET public String hello() { Timer timer = service.timer("test"); try(Context t = timer.time()) { return "Hello World"; } } @GET @Path("/test2") public void test(@Valid @CustomValidation @QueryParam("arg") String test) { System.out.println(test); }}不要介意这些指标,它们与之无关。重要的是,您需要告诉DW您想要验证的内容。
在资源中,请参阅测试方法。我用@Valid(告诉DW进行验证)@CustomValidation(告诉DW使用什么验证器)注释我需要的参数。
这实际上不是Dropwizard的功能,而是休眠验证器的实现。
它的幕后工作方式是休眠通过调用构造函数在请求时动态创建Validator类。现在,如果您具有简单的验证(例如说比较字符串),则此方法就很好了。如果您需要依赖项,那么它将变得更加棘手。
本示例使用guice,但它演示了如何将自己的创建机制挂接到验证中。这样,您可以控制验证器的创建并将其注入或初始化为数据源以访问数据库。
我希望能回答您的问题,



