Spring约束验证上下文 - 数据库请求缓存

时间:2016-11-19 13:13:32

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

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

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<String, Boolean>,因为这会缓存整个应用程序生命周期的结果。

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

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

提前致谢!

1 个答案:

答案 0 :(得分:0)

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

您可以缓存服务电话。您需要在服务方法和一些配置上添加注释。

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

或者,如果您的需求很简单,您可以实现自己的缓存提供程序。如果是Web请求,在此缓存中您可能会发现ThreadLocal很有用。你可以使用threadlocal为这个正在运行的线程做所有的缓存。处理请求时,您可以清除threadlocal缓存。