Bean validation not working after updating to Spring Boot 3.

huangapple go评论84阅读模式
英文:

Bean validation not working after updating to Spring Boot 3

问题

在将Spring Boot升级到3之后,使用bean验证时出现以下异常:

  1. java.lang.IllegalStateException: Failed to load ApplicationContext for [MergedContextConfiguration@54089484 testClass = com.sogh.rest.EventFeedClientTest, locations = [], classes = [], contextInitializerClasses = [], activeProfiles = [], propertySourceLocations = [], propertySourceProperties = ["rest.endpoints.query.backoff=1000"], contextCustomizers = [[ImportsContextCustomizer@45adc393 key = [com.sogh.utils.TestConfig, com.globalrelay.mc.oscar.common.logging.LoggingConfiguration, com.sogh.rest.RestApiConfig]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@437da279, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@6253c26, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@254ea8f8, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@9da1, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@69e153c5], contextLoader = org.springframework.test.context.support.DelegatingSmartContextLoader, parent = null]
  2. ...

此异常的原因是Bean Validation提供程序无法找到,导致无法创建Configuration。你需要确保在你的类路径中添加了Bean Validation提供程序,例如Hibernate Validator(RI)。此外,你还需要检查你的Maven依赖配置,确保它们正确。

如果你已经添加了相关依赖,但仍然遇到问题,可能需要检查Maven构建是否正确,依赖是否正确加载,并且没有冲突。如果一切看起来正确,还可以尝试清理Maven本地存储库(~/.m2/repository)并重新构建项目以确保依赖正确下载。

英文:

After updating to Spring Boot 3 I get the following exception while using bean validation:

  1. java.lang.IllegalStateException: Failed to load ApplicationContext for [MergedContextConfiguration@54089484 testClass = com.sogh.rest.EventFeedClientTest, locations = [], classes = [], contextInitializerClasses = [], activeProfiles = [], propertySourceLocations = [], propertySourceProperties = ["rest.endpoints.query.backoff=1000"], contextCustomizers = [[ImportsContextCustomizer@45adc393 key = [com.sogh.utils.TestConfig, com.globalrelay.mc.oscar.common.logging.LoggingConfiguration, com.sogh.rest.RestApiConfig]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@437da279, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@6253c26, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@254ea8f8, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@9da1, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@69e153c5], contextLoader = org.springframework.test.context.support.DelegatingSmartContextLoader, parent = null]
  2. at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:142)
  3. at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:127)
  4. at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.postProcessFields(MockitoTestExecutionListener.java:110)
  5. at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.injectFields(MockitoTestExecutionListener.java:94)
  6. at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.prepareTestInstance(MockitoTestExecutionListener.java:61)
  7. at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:241)
  8. at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:138)
  9. at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$10(ClassBasedTestDescriptor.java:377)
  10. at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:382)
  11. at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:377)
  12. at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
  13. at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
  14. at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
  15. at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
  16. at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
  17. at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:310)
  18. at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735)
  19. at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734)
  20. at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
  21. at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:376)
  22. at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$6(ClassBasedTestDescriptor.java:289)
  23. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  24. at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:288)
  25. at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$4(ClassBasedTestDescriptor.java:278)
  26. at java.base/java.util.Optional.orElseGet(Optional.java:364)
  27. at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:277)
  28. at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31)
  29. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:105)
  30. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  31. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104)
  32. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68)
  33. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:123)
  34. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  35. at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:123)
  36. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:90)
  37. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  38. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
  39. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
  40. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  41. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
  42. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  43. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
  44. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  45. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
  46. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
  47. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  48. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
  49. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
  50. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  51. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
  52. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  53. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
  54. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  55. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
  56. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
  57. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
  58. at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
  59. at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
  60. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:147)
  61. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:127)
  62. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:90)
  63. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:55)
  64. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:102)
  65. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:54)
  66. at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
  67. at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)
  68. at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)
  69. at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53)
  70. at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57)
  71. at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
  72. at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
  73. at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
  74. at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)
  75. at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
  76. Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'eventFeedClient' defined in class path resource [com/globalrelay/mc/oscar/common/normalizer/service/rest/RestApiConfig.class]: Failed to instantiate [com.sogh.rest.EventFeedClient]: Factory method 'eventFeedClient' threw exception with message: Unable to create a Configuration, because no Bean Validation provider could be found. Add a provider like Hibernate Validator (RI) to your classpath.
  77. at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:657)
  78. at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:645)
  79. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1332)
  80. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1162)
  81. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:560)
  82. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520)
  83. at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
  84. at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
  85. at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
  86. at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
  87. at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973)
  88. at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:917)
  89. at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:584)
  90. at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:221)
  91. at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:110)
  92. at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:212)
  93. at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:184)
  94. at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:118)
  95. ... 73 more
  96. Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.sogh.rest.EventFeedClient]: Factory method 'eventFeedClient' threw exception with message: Unable to create a Configuration, because no Bean Validation provider could be found. Add a provider like Hibernate Validator (RI) to your classpath.
  97. at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:171)
  98. at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653)
  99. ... 90 more
  100. Caused by: javax.validation.NoProviderFoundException: Unable to create a Configuration, because no Bean Validation provider could be found. Add a provider like Hibernate Validator (RI) to your classpath.
  101. at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:291)
  102. at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:103)
  103. at com.sogh.rest.AbstractRestClient.<init>(AbstractRestClient.java:42)
  104. at com.sogh.rest.EventFeedClient.<init>(EventFeedClient.java:30)
  105. at com.sogh.rest.RestApiConfig.eventFeedClient(RestApiConfig.java:76)
  106. at com.sogh.rest.RestApiConfig$$SpringCGLIB$$0.CGLIB$eventFeedClient$1(<generated>)
  107. at com.sogh.RestApiConfig$$SpringCGLIB$$2.invoke(<generated>)
  108. at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:258)
  109. at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331)
  110. at com.sogh.RestApiConfig$$SpringCGLIB$$0.eventFeedClient(<generated>)
  111. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  112. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
  113. at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  114. at java.base/java.lang.reflect.Method.invoke(Method.java:568)
  115. at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:139)
  116. ... 91 more

This is the line of code on which it fails:

  1. private final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

I have the following dependencies configured in Maven:

  1. <dependency>
  2. <groupId>javax.validation</groupId>
  3. <artifactId>validation-api</artifactId>
  4. <version>2.0.1.Final</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.hibernate.validator</groupId>
  8. <artifactId>hibernate-validator</artifactId>
  9. <version>8.0.0.Final</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-validation</artifactId>
  14. <version>3.0.5</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>jakarta.validation</groupId>
  18. <artifactId>jakarta.validation-api</artifactId>
  19. <version>3.0.2</version>
  20. </dependency>

What am I missing?

答案1

得分: 1

这部分内容的中文翻译如下:

这是无法工作的,查看 https://stackoverflow.com/a/69076232/6692043

基本上,你应该从你的依赖项中移除以下内容:

  1. <dependency>
  2. <groupId>javax.validation</groupId>
  3. <artifactId>validation-api</artifactId>
  4. <version>2.0.1.Final</version>
  5. </dependency>

而且你应该在你的代码中使用 jakarta.validation.* 而不是 javax.validation.*

英文:

This cannot work, see https://stackoverflow.com/a/69076232/6692043

Basically you should remove this from your dependencies:

  1. <dependency>
  2. <groupId>javax.validation</groupId>
  3. <artifactId>validation-api</artifactId>
  4. <version>2.0.1.Final</version>
  5. </dependency>

And you should use jakarta.validation.* instead of javax.validation.* in your code.

huangapple
  • 本文由 发表于 2023年4月6日 23:05:52
  • 转载请务必保留本文链接:https://go.coder-hub.com/75951034.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定