怎样才能在Spring v5 (Spring Boot v2)中为ValidatorFactory配置提供自己的v5,以便在注入Bean Validations Validator的任何地方都可以使用它?
用例:您希望为它认为“存在”的内容提供一个缓冲区,如此blog post中所描述的,以说明合理数量的时钟漂移。
发布于 2018-01-19 18:11:35
Spring5只在运行时与Bean Validation 2.0兼容,后者引入了您想要使用的ClockProvider。请参阅Spring sources中的下一段代码。我认为有两种方法可以解决这个问题。您可以尝试对验证器使用xml配置,并在那里指定时钟提供者。在你的validation.xml中,它看起来就像这样:
<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中设置,也可以通过编程来设置。
发布于 2021-08-17 14:27:36
保持所有Spring默认值不变的最简单的解决方案是重写方法postProcessConfiguration()
@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;
}
}发布于 2020-03-30 21:03:00
检查此blogpost
@Bean
@ConditionalOnMissingBean(ClockProvider.class) // to allow tests to overwrite it
public ClockProvider getClockProvider() {
return () -> Clock.systemDefaultZone();
}https://stackoverflow.com/questions/48335736
复制相似问题