2017-12-13 6 views
1

Ich versuche, Spring Cloud Consul in eine vorhandene Spring Boot-App mit aktivierter Spring-Validierung hinzuzufügen. Es ist alles gut, bis ich die app laufen, und es scheitert an der Validierung einer Bean-Eigenschaften mit Anmerkungen versehen mit @ValidatedMethodValidationPostProcessor verursacht weitere Validierungsfehler

Soweit ich es bekommen habe, hier ist was passiert:

  1. MethodValidationPostProcessor schafft einen Proxy für die Eigenschaften Bohne
  2. CustomBeanValidationPostProcessor Tritte in und versucht, die Proxy-Felder und schlägt mit dem folgenden zu überprüfen:

    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 
    

Hier ist ein Mindest-Projekt Wiedergabe der Ausgabe: https://github.com/bashnesnos/cas-spring-cloud-consul-issue

Fragen:

  1. Wenn jemand wissen alle Behelfslösung MethodValidationPostProcessor für eine bestimmte Bean zu vermeiden?

P.S. Ich habe auch ein Ticket für den Frühling erstellt https://github.com/spring-projects/spring-boot/issues/11249, aber ich denke, es könnte einfacher sein, nach einem Workaround in der Gemeinschaft zu fragen.

Antwort

1

Ihr CustomBeanValidationProcessor könnte Ordered implementieren. Dann können Sie die Reihenfolge ändern, so dass sie früher aufgerufen wird.

public class CustomBeanValidationPostProcessor extends 
    BeanValidationPostProcessor implements Ordered { 

    @Override 
    public int getOrder() { 
     return HIGHEST_PRECEDENCE; // or another value for a proper order position 
    } 
} 
+0

Danke, wenn Sie die Antwort auf HIGHEST_PRECEDENCE ändern (da CustomBeanValidationProcessor tatsächlich ausgeführt wird später verursacht das Problem) Ich denke, es als eine Arbeit tun, um die ich schätze. Vielleicht gäbe es andere Probleme als Zufall, aber das wäre eine andere Geschichte)) – bashnesnos