首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何提供Spring v5 (Spring Boot v2)的ClockProvider?

如何提供Spring v5 (Spring Boot v2)的ClockProvider?
EN

Stack Overflow用户
提问于 2018-01-19 15:02:53
回答 3查看 1.4K关注 0票数 1

怎样才能在Spring v5 (Spring Boot v2)中为ValidatorFactory配置提供自己的v5,以便在注入Bean Validations Validator的任何地方都可以使用它?

用例:您希望为它认为“存在”的内容提供一个缓冲区,如此blog post中所描述的,以说明合理数量的时钟漂移。

EN

回答 3

Stack Overflow用户

发布于 2018-01-19 18:11:35

Spring5只在运行时与Bean Validation 2.0兼容,后者引入了您想要使用的ClockProvider。请参阅Spring sources中的下一段代码。我认为有两种方法可以解决这个问题。您可以尝试对验证器使用xml配置,并在那里指定时钟提供者。在你的validation.xml中,它看起来就像这样:

代码语言:javascript
复制
<validation-config
        xmlns="http://xmlns.jcp.org/xml/ns/validation/configuration"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/validation/configuration
            http://xmlns.jcp.org/xml/ns/validation/configuration/validation-configuration-2.0.xsd"
        version="2.0">
    // any other configurations...
    <clock-provider>com.acme.ClockProvider</clock-provider>
</validation-config>

如果您不喜欢xml,另一个选择是尝试定义并使用您自己的LocalValidatorFactoryBean

还请注意,对于您的用例,使用Hibernate Validator中引入的一个相对较新的特性-临时验证容差可能会很有用,该特性允许为时间约束指定容差。有关它的更多详细信息,请参阅documentation。这个容差也可以在xml中设置,也可以通过编程来设置。

票数 1
EN

Stack Overflow用户

发布于 2021-08-17 14:27:36

保持所有Spring默认值不变的最简单的解决方案是重写方法postProcessConfiguration()

代码语言:javascript
复制
@Configuration
class TimeConfiguration {

    @Bean
    static Clock clock() {
        return Clock.fixed(
                Instant.ofEpochSecond(1700000000), ZoneOffset.UTC
        );
    }

    @Bean
    static LocalValidatorFactoryBean defaultValidator(Clock clock) {
        LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean() {

            @Override
            protected void postProcessConfiguration(
                javax.validation.Configuration<?> configuration) {
                configuration.clockProvider(() -> clock);
            }
        };
        MessageInterpolatorFactory interpolatorFactory =
            new MessageInterpolatorFactory();
        factoryBean.setMessageInterpolator(interpolatorFactory.getObject());
        return factoryBean;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2020-03-30 21:03:00

检查此blogpost

代码语言:javascript
复制
@Bean
@ConditionalOnMissingBean(ClockProvider.class) // to allow tests to overwrite it
public ClockProvider getClockProvider() {
    return () -> Clock.systemDefaultZone();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48335736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档