MethodValidationPostProcessor вызывает дальнейший сбой проверки
Я пытаюсь добавить Spring Cloud Consul в существующее приложение Spring Boot с включенной весенней проверкой. Это все хорошо, пока я не запускаю приложение, и оно завершается неудачно при проверке bean-компонента свойств, помеченного как @Validated
Насколько я понял, вот что происходит:
MethodValidationPostProcessor
создает прокси для свойства beanCustomBeanValidationPostProcessor
запускает и пытается проверить поля прокси и завершается неудачно с помощью следующего:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'heartbeatProperties' defined in issues.validation.Application: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanInitializationException: Bean state is invalid: ttlUnit - may not be null; ttlValue - must be greater than or equal to 1; intervalRatio - must be greater than or equal to 0.1 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) ~[spring-context-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) ~[spring-context-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693) [spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360) [spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:303) [spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) [spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) [spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE] at issues.validation.Application.main(Application.java:25) [classes/:na] Caused by: org.springframework.beans.factory.BeanInitializationException: Bean state is invalid: ttlUnit - may not be null; ttlValue - must be greater than or equal to 1; intervalRatio - must be greater than or equal to 0.1 at org.springframework.validation.beanvalidation.BeanValidationPostProcessor.doValidate(BeanValidationPostProcessor.java:116) ~[spring-context-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.validation.beanvalidation.BeanValidationPostProcessor.postProcessAfterInitialization(BeanValidationPostProcessor.java:94) ~[spring-context-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:423) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1633) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE] ... 15 common frames omitted
Вот минимальный проект, воспроизводящий проблему: https://github.com/bashnesnos/cas-spring-cloud-consul-issue
Вопросы:
- Если кто-нибудь знает обходной путь, чтобы избежать
MethodValidationPostProcessor
для конкретного боба?
PS Я также создал тикет для Spring https://github.com/spring-projects/spring-boot/issues/11249, но я думаю, что может быть проще попросить обойти в сообществе.
1 ответ
Ваш CustomBeanValidationProcessor может реализовать Ordered. Затем вы можете изменить порядок, чтобы он вызывался раньше.
public class CustomBeanValidationPostProcessor extends
BeanValidationPostProcessor implements Ordered {
@Override
public int getOrder() {
return HIGHEST_PRECEDENCE; // or another value for a proper order position
}
}