I am attempting to run the latest Bean Validation 2.0 TCK with OpenLiberty (which uses Hibernate Validator 6.0.4.Final), and am finding that there are a number of tests which are testing invalid validation.xml's and expect errors on-use of the application, but OpenLiberty throws these exceptions at app deployment time (due to OpenLiberty performing CDI scanning at app startup time, triggering a read of the validation.xml).
For example: https://github.com/beanvalidation/beanvalidation-tck/blob/master/tests/src/main/java/org/hibernate/beanvalidation/tck/tests/bootstrap/BootstrapConfigurationWithEmptyValidatedExecutableTypesTest.java
https://github.com/beanvalidation/beanvalidation-tck/blob/master/tests/src/main/java/org/hibernate/beanvalidation/tck/tests/xmlconfiguration/ClockProviderSpecifiedInValidationXmlNoDefaultConstructorTest.java
[Section 9 of the spec|http://beanvalidation.org/2.0/spec/#xml] indicates that if any sort of issues arise while processing the validation.xml, then a ValidationException ought to be thrown. But the spec does not make it clear that this validation should or should not prevent the application from starting. On the OpenLiberty side, we would prefer to fail up-front and not start an application if there is an invalid validation.xml.
The exception we get at deployment time is still correct (although the ValidationException is wrapped in a CDI DeploymentException): { { quote} javax.validation.ValidationException: HV000201: Unable to instantiate clock provider class org.hibernate.beanvalidation.tck.tests.xmlconfiguration.XmlDefinedClockProviderWithNoDefaultConstructor. at org.hibernate.validator.internal.xml.ValidationBootstrapParameters.setClockProvider(ValidationBootstrapParameters.java:241) at org.hibernate.validator.internal.xml.ValidationBootstrapParameters.<init>(ValidationBootstrapParameters.java:61) at org.hibernate.validator.internal.engine.ConfigurationImpl.parseValidationXml(ConfigurationImpl.java:512) at org.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:317) at org.hibernate.validator.cdi.ValidationExtension.<init>(ValidationExtension.java:119) at com.ibm.ws.beanvalidation.v20.cdi.internal.LibertyHibernateValidatorExtension.delegate(LibertyHibernateValidatorExtension.java:112) at com.ibm.ws.beanvalidation.v20.cdi.internal.LibertyHibernateValidatorExtension.beforeBeanDiscovery(LibertyHibernateValidatorExtension.java:132) at sun.reflect.GeneratedMethodAccessor124.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.jboss.weld.injection.StaticMethodInjectionPoint.invoke(StaticMethodInjectionPoint.java:95) at org.jboss.weld.injection.MethodInvocationStrategy$SpecialParamPlusBeanManagerStrategy.invoke(MethodInvocationStrategy.java:144) at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:330) at org.jboss.weld.event.ExtensionObserverMethodImpl.sendEvent(ExtensionObserverMethodImpl.java:123) at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:308) at org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:286) at javax.enterprise.inject.spi.ObserverMethod.notify(ObserverMethod.java:124) at org.jboss.weld.util.Observers.notify(Observers.java:166) at org.jboss.weld.event.ObserverNotifier.notifySyncObservers(ObserverNotifier.java:285) at org.jboss.weld.event.ObserverNotifier.notify(ObserverNotifier.java:273) at org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:177) at org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:171) at org.jboss.weld.bootstrap.events.AbstractContainerEvent.fire(AbstractContainerEvent.java:53) at org.jboss.weld.bootstrap.events.AbstractDefinitionContainerEvent.fire(AbstractDefinitionContainerEvent.java:44) at org.jboss.weld.bootstrap.events.BeforeBeanDiscoveryImpl.fire(BeforeBeanDiscoveryImpl.java:54) at org.jboss.weld.bootstrap.WeldStartup.startInitialization(WeldStartup.java:391) at org.jboss.weld.bootstrap.WeldBootstrap.startInitialization(WeldBootstrap.java:76) at com.ibm.ws.cdi.impl.CDIContainerImpl$2.run(CDIContainerImpl.java:142) at com.ibm.ws.cdi.impl.CDIContainerImpl$2.run(CDIContainerImpl.java:139) at java.security.AccessController.doPrivileged(Native Method) at com.ibm.ws.cdi.impl.CDIContainerImpl.applicationStarting(CDIContainerImpl.java:139) at com.ibm.ws.cdi.liberty.CDIRuntimeImpl.applicationStarting(CDIRuntimeImpl.java:383) at com.ibm.ws.container.service.state.internal.ApplicationStateManager.fireStarting(ApplicationStateManager.java:28) at com.ibm.ws.container.service.state.internal.StateChangeServiceImpl.fireApplicationStarting(StateChangeServiceImpl.java:50) at com.ibm.ws.app.manager.module.internal.DeployedAppInfoBase.preDeployApp(DeployedAppInfoBase.java:383) at com.ibm.ws.app.manager.module.internal.DeployedAppInfoBase.deployApp(DeployedAppInfoBase.java:412) at com.ibm.ws.app.manager.war.internal.WARApplicationHandlerImpl.install(WARApplicationHandlerImpl.java:65) at com.ibm.ws.app.manager.internal.statemachine.StartAction.execute(StartAction.java:140) at com.ibm.ws.app.manager.internal.statemachine.ApplicationStateMachineImpl.enterState(ApplicationStateMachineImpl.java:1258) at com.ibm.ws.app.manager.internal.statemachine.ApplicationStateMachineImpl.performAction(ApplicationStateMachineImpl.java:1106) at com.ibm.ws.app.manager.internal.statemachine.ApplicationStateMachineImpl.run(ApplicationStateMachineImpl.java:881) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) {quote } } |
|