使用dropwizardvalidation,我可以访问数据库以插入记录

我的问题如下:

我正在使用dropwizard进行项目,到目前为止,我已经愉快地成功使用了validation框架。 我的validation工作正常,它以标准方式使用。 这就是我所拥有的:

请求类:

import javax.validation.constraints.NotNull; import MandatoryFieldLengthCheck; public class InitiatePaymentRequest implements PaymentRequest { @NotNull(message = "Mandatory input field missing") @MandatoryFieldLengthCheck(value = 32) protected String transactionId; } 

然后是注释类:

 @Target({ METHOD, FIELD, ANNOTATION_TYPE }) @Retention(RUNTIME) @Constraint(validatedBy = MandatoryFieldLengthCheckValidator.class) @Documented public @interface MandatoryFieldLengthCheck { String message() default "Invalid input data"; Class[] groups() default {}; Class[] payload() default {}; long value(); } 

然后是validation器类:

 public class MandatoryFieldLengthCheckValidator implements ConstraintValidator { private static final Logger LOGGER = LoggerFactory.getLogger(MandatoryFieldLengthCheckValidator.class); private long length; @Override public void initialize(final MandatoryFieldLengthCheck constraintAnnotation) { this.length = constraintAnnotation.value(); } @Override public boolean isValid(final Object object, final ConstraintValidatorContext constraintContext) { LOGGER.debug("isValid [{}]", object); // fields with a MandatoryFieldLengthCheck will also have a NotNull annotation so // nulls will be handled there, to avoid returning an invalid field value return true here if (object == null) { return true; } if (object instanceof Long || object instanceof Integer || object instanceof Short) { return object.toString().length()  0) && (((String) object).length() <= this.length); } else { return false; } } } 

这很有效,很好。

现在,从MandatoryFieldLengthCheckValidator,我想在数据库中插入一条记录(它必须是数据库),就像validation失败一样,用于审计目的。

我试图注入DAO但没有成功,不确定是否可能。 validation器是动态创建的,所以我无法控制我传递的内容,除非有一些魔法注入dao。

所以我的问题是我怎么能这样做,更具体地说:

  • 我可以注射DAO吗?
  • 从validation码访问您的数据库是否有意义?
  • 我可以重新配置validation引擎以获得此function吗?
  • 还有其他框架可以让我这样做吗?
  • 还有其他办法吗? AOP? 使用静态方法?

即使你并不确切,如果你指出我正确的方向,它会欣赏它。 谢谢。

soz,我迟到了。 有一种方法可以使这个工作(注入validation器)。 请注意,validation器应该简单的注释仍然适用,但有时您只需注入一些其他对象进行正确的validation。 所以这就是你如何实现这个目标的:

首先,我假设你已经设置了DI。 如果没有,请查看https://github.com/xvik/dropwizard-guicey – 它将guice集成到dropwizard中,并且做得非常好。 一旦你完成了这个设置,你几乎就在那里。

validation适用于Validator类,它将动态创建validation器 – 你是正确的。 这个创建将无法注入任何值,因为它并不意味着开箱即用。

您可以创建一个模块(由guice处理),为您创建validation器。 这看起来像这样:

 public class ValidationModule extends AbstractModule { @Override protected void configure() { bind(GuiceConstraintValidationFactory.class).in(Singleton.class); } @Provides public Validator validator(GuiceConstraintValidationFactory validatoFactory) { return Validation.byDefaultProvider().configure().constraintValidatorFactory(validatoFactory).buildValidatorFactory().getValidator(); } } 

请注意,这会创建一个GuiceConstraintValidationFactory。 这个工厂只是一个委托,它将返回正确的validation器。 它是一个委托,以便旧的validation器仍然可以工作(NotNull和朋友)。 这是一些代码:

 public class GuiceConstraintValidationFactory implements ConstraintValidatorFactory { private ConstraintValidatorFactory delegate; private Set validators; @Inject public GuiceConstraintValidationFactory(final Set validators) { this.validators = validators; delegate = new ConstraintValidatorFactoryImpl(); } @Override public > T getInstance(Class key) { for(ConstraintValidator validator : validators) { if(validator.getClass() == key) { return (T) validator; } } return delegate.getInstance(key); } @Override public void releaseInstance(ConstraintValidator instance) { delegate.releaseInstance(instance); } } 

请注意此类如何获取注入validation器。 这些validation器是guice句柄,因此它们可以有注入字段。 例如:

 @Plugin(ConstraintValidator.class) public class ResourceValidator implements ConstraintValidator{ private static final Logger log = Logger.getLogger(ResourceValidator.class); @Inject private MyConfiguration conf; @Override public void initialize(ValidResource constraintAnnotation) { // nothing to do here } @Override public boolean isValid(String value, ConstraintValidatorContext context) { if(value == null) { return true; } String fullPath = conf.getBasePath() + File.separator + value; return new File(fullPath).exists(); } } 

这个validation器是guice处理。 @Plugin注释启用了guicey dropwizard来创建实例,注入它然后将它们全部组合在一个集合中(使它更容易注入它们)请参阅GuiceConstraintValidationFactory,其中一组validation器被注入工厂。 现在,默认validation器将使用此工厂。 在请求新validation器时,工厂会检查是否存在所需类型的guice托管validation器。 如果没有,它将默认返回正常的validation器实现。 如果是,它将返回guice托管validation器。 这使您可以动态添加新的validation器,并且可以创建,管理和注入它们。

我希望有所帮助。

– 阿图尔