【问题标题】:Spring Constraint Validation Context - Database Request CachingSpring 约束验证上下文 - 数据库请求缓存
【发布时间】:2016-11-19 13:13:32
【问题描述】:

我编写了一个自定义验证注释和一个 ConstraintValidator 实现,它使用 Spring 服务(并执行数据库查询):

public class MyValidator implements ConstraintValidator<MyValidationAnnotation, String> {
    private final MyService service;

    public MyValidator(MyService service) {
        this.service = service;
    }

    @Override
    public void initialize(MyValidationAnnotation constraintAnnotation) {}

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return service.exists(value);
    }
}

它是这样使用的:

public class MyEntity {
    @Valid
    List<Foo> list;
}

public class Foo {
    @MyValidationAnnotation
    String id;
}

这很好用,但是service.exists(value)list 中的每个项目调用,这是正确的,但可以/应该优化。

问题:

在验证MyEntity 的实例时,我想缓存 service.exists(value) 调用的结果。

想使用static HashMap&lt;String, Boolean&gt;,因为这会在整个应用程序生命周期内缓存结果。

是否可以访问某种约束验证上下文,该上下文仅在 此特定验证 运行时存在,因此我可以将缓存的结果放在那里?

或者你有其他解决方案吗?

提前致谢!

【问题讨论】:

    标签: spring validation caching spring-boot bean-validation


    【解决方案1】:

    您可以使用 Spring 的 cache 支持。应用程序中可能还有其他部分需要缓存,并且可以重用。而且设置也非常简单。它会让你的代码保持整洁和可读。

    您可以缓存您的服务调用。您需要在服务方法上添加注释并进行一些配置。

    对于缓存提供程序,您可以使用Ehcache。如果需要,您有许多选项,例如设置 ttl 和可以缓存的最大元素数以及驱逐策略等。

    如果您的需求很简单,您也可以实现自己的缓存提供程序。如果是 web 请求,在这个缓存中你可能会发现 ThreadLocal 很有用。您可以使用 threadlocal 对此正在运行的线程进行所有缓存。处理请求后,您可以清除线程本地缓存。

    【讨论】:

      猜你喜欢
      • 2015-09-30
      • 2013-05-21
      • 1970-01-01
      • 2017-03-24
      • 2016-12-25
      • 2013-07-24
      • 1970-01-01
      • 2017-04-14
      • 2011-06-10
      相关资源
      最近更新 更多