如果spring-cloud-stream在类路径上,则spring-boot自动配置正在寻找默认的绑定器

问题描述 投票:0回答:1

我正在开发一个Spring-boot多模块应用程序,在该应用程序中,我们正在创建一个自定义的Fat jar,以绑定所有第三方依赖项。 Spring cloud stream也是该脂肪罐的一部分。我们的应用程序正在spring-cloud-stream版本2.1.3.RELEASEspring-boot 2.1.6.RELEASE)上运行,我们正在将其升级到3.0.2.RELEASEspring-boot 2.2.4.RELEASE)。我们在这里遇到一个问题。如果某个特定的模块不使用spring-cloud-stream,但是spring-cloud-stream在类路径上,那么spring-boot auto-configuration正在寻找default binder

{"mdc":{},"timestamp":"2020-03-20 12:53:04.150","level":"ERROR","logger":"org.springframework.boot.SpringApplication",
"message":"Application run failed", "exception":"\r\norg.springframework.context.ApplicationContextException: 
Failed to start bean 'outputBindingLifecycle'; 
nested exception is java.lang.IllegalArgumentException: <b>A default binder has been requested, but there is no binder available</b>\r\n\
 org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:185)\r\n\
 org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:53)\r\n\
 org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:360)\r\n\
 org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:158)\r\n\
 org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:122)\r\n\
 org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:894)\r\n\
 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:162)\r\n\
 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:553)\r\n\
 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)\r\n\
 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)\r\n\
 org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)\r\n\
 org.springframework.boot.SpringApplication.run(SpringApplication.java:315)\r\n\
 org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:126)\r\n\
 org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal
 (DefaultCacheAwareContextLoaderDelegate.java:99)\r\n\
 org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)\r\n\
 org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:123)\r\n\
 org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.outputConditionEvaluationReport
 (SpringBootDependencyInjectionTestExecutionListener.java:53)\r\n\
 org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.prepareTestInstance
 (SpringBootDependencyInjectionTestExecutionListener.java:46)\r\n\
 org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:244)\r\n\
 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227)\r\n\
 org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)\r\n\
 org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)\r\n\
 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)\r\n\
 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246)\r\n\
 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)\r\n\
 org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)\r\n\
 org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)\r\n\
 org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)\r\n\
 org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)\r\n\
 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)\r\n\
 org.springframework.test.context.junit4.s
ements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)\r\n\
 org.springframework.test.context.junit4.s
ements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)\r\n\
 org.junit.runners.ParentRunner.run(ParentRunner.java:363)\r\n\
 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)\r\n\
 org.junit.runner.JUnitCore.run(JUnitCore.java:137)\r\n\
 org.junit.runner.JUnitCore.run(JUnitCore.java:115)\r\n\
 org.junit.vintage.engine.execution.RunnerExecutor.execute(RunnerExecutor.java:40)\r\n\
 java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source)\r\n\
 java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)\r\n\
 java.util.Iterator.forEachRemaining(Unknown Source)\r\n\
 java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source)\r\n\
 java.util.stream.AbstractPipeline.copyInto(Unknown Source)\r\n\
 java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)\r\n\
 java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source)\r\n\
 java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source)\r\n\
 java.util.stream.AbstractPipeline.evaluate(Unknown Source)\r\n\
 java.util.stream.ReferencePipeline.forEach(Unknown Source)\r\n\
 org.junit.vintage.engine.VintageTestEngine.executeAllChildren(VintageTestEngine.java:80)\r\n\
 org.junit.vintage.engine.VintageTestEngine.execute(VintageTestEngine.java:71)\r\n\
 org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229)\r\n\
 org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197)\r\n\
 org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211)\r\n\
 org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191)\r\n\
 org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:137)\r\n\
 org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:89)\r\n\
 org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)\r\n\
 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)\r\n\
 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)\r\n\
 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)\r\n\
 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)\r\nCaused by: 
 java.lang.IllegalArgumentException: A default binder has been requested, but there is no binder 
 available\r\n\
 org.springframework.util.Assert.notEmpty(Assert.java:549)\r\n\
 org.springframework.cloud.stream.binder.DefaultBinderFactory.doGetBinder(DefaultBinderFactory.java:144)\r\n\
 org.springframework.cloud.stream.binder.DefaultBinderFactory.getBinder(DefaultBinderFactory.java:134)\r\n\
 org.springframework.cloud.stream.binding.BindingService.getBinder(BindingService.java:362)\r\n\
 org.springframework.cloud.stream.binding.BindingService.bindProducer(BindingService.java:257)\r\n\
 org.springframework.cloud.stream.binding.AbstractBindableProxyFactory.createAndBindOutputs(AbstractBindableProxyFactory.java:136)\r\n\
 org.springframework.cloud.stream.binding.OutputBindingLifecycle.doStartWithBindable(OutputBindingLifecycle.java:58)\r\n\
 java.util.LinkedHashMap$LinkedValues.forEach(Unknown Source)\r\n\
 org.springframework.cloud.stream.binding.AbstractBindingLifecycle.start(AbstractBindingLifecycle.java:57)\r\n\
 org.springframework.cloud.stream.binding.OutputBindingLifecycle.start(OutputBindingLifecycle.java:34)\r\n\
 org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:182)\r\n\t... 59 common frames omitted\r\n\r\n"}

我们可以使用两种方法:-

  • 没有使用spring-cloud-stream,所以我可以排除该脂肪罐中的spring-cloud-stream,因此它不会寻找任何粘合剂。
  • 以下依赖关系提供了一个测试绑定器,因此无需真正的活页夹的实现,我们可以使用来测试我们的应用程序它。
<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-stream-test-support</artifactId>
       <version>3.0.2.RELEASE</version>
       <scope>test</scope>
   </dependency>

我想知道我是否可以在应用程序中使用任何其他方法或可配置属性,以便可以停止寻找默认的资料夹。

spring-boot spring-cloud spring-cloud-stream
1个回答
0
投票

我认为您使用这种方法违反了弹簧引导原则,因此创建了非常庞大的e JAR,这些JAR带有从未使用过的依赖项。确保可以使用exclude@SpringBootApplication属性,并排除某些自动配置类。但是我实际上是在问为什么在类路径上有一些永远不会使用的东西,而不管这些东西是自动配置JAR还是仅仅是库JAR?此外,还存在瞬时依赖关系,因此使用s-c-stream带来的其他许多JAR实际上可能与您打算使用的东西产生冲突。

© www.soinside.com 2019 - 2024. All rights reserved.