当前位置: 首页 > 知识库问答 >
问题:

Spring Boot Camel-Camel组件中的自动布线问题

徐茂材
2023-03-14

我正在使用SpringBoot1.5.7和ApacheCamel 2.19.3,使用SpringBootStarterCamel提供的SpringBoot自动配置

这是相当基本的Spring Boot和Camel初始化,正如他们的教程中所述,所以我们有一个RouteBuilder组件,可以完全做到这一点。

@Component
public class CIFRoutes extends  RouteBuilder {

  @Override
  public void configure() throws Exception {
  // build routes
  }
}

我们有一个配置,它定义了应用程序中需要的一些bean

@Configuration
public class MyConfiguration {

  @Bean
  public void Map<String, Object> map() {
    return new HashMap<>()
  }
}

最后,我们有一个定制的InflightRepository实现,该实现应该通过自动配置进行扫描,并添加到CamelContext中,这基本上可以正常工作,但由于某些原因,组件没有正确初始化。也就是说,它的依赖项没有初始化,但是bean被实例化并注入到我的应用程序中。

@Component
public class MyCustomInflightRepository extends DefaultInflightRepository {

  @Autowired
  private Map<String, Object> map;

  @Override
  public void add(Exchange exchange) {
  super.addExchange(exchange);
   // ....
  }
}

现在的问题是map仍然是(null),我还尝试添加@PostConstruct初始值设定项方法,但没有调用它。

据我所知,它似乎与CamelAutoConfiguration中的premature有关,CamelContext bean在这里被实例化(在私有方法AfterPropertieSet中完成)。

InflightRepository inflightRepository = getSingleBeanOfType(applicationContext, InflightRepository.class);
if (inflightRepository != null) {
     LOG.info("Using custom InflightRepository: {}", inflightRepository);
            camelContext.setInflightRepository(inflightRepository);
}

如果MyCustomInflight Repository没有实现Inflight Repository,则bean会正确初始化,但Camel确实无法识别。禁用自动配置时,将注入bean的依赖项。

所以,要么我按照Spring的标准做了不可能的事情,要么Spring的Camel组件有些可疑。

共有2个答案

端木飞
2023-03-14

问题是映射

相反,要更具体,或者可能提供必要的参数作为构造函数参数,并在@Bean方法中显式配置它们(无论如何总是使用构造函数注入是个好主意)。

张砚
2023-03-14

我解决这个问题有点快(我两天前就想发布这个了^^),但是一个同事发现了问题所在。

当使用CamelAutoConfiguration(或实际上Camel试图在这里获得匹配bean的所有内容)时,在属性解析器完全初始化之前访问上下文,这导致在解析任何自动连接的属性之前初始化bean(并在上下文中缓存)...

我不是Spring专家,但在我看来,这种行为有点问题,因为当您依赖Spring DI来定制组件时,未初始化的bean会被拉到上下文中。

当然,我会向维护人员提出这个问题。。。

顺便说一下,我的简单解决方案是在上下文配置中手动设置正在运行的存储库(如建议的)

@Bean
public CamelContextConfiguration camelConfig() {
    return new CamelContextConfiguration() {
        @Override
        public void beforeApplicationStart(CamelContext context) {

            context.setInflightRepository(new MyCustomInflightRepository(/* Dependencies go here */ ));
        }

        @Override
        public void afterApplicationStart(CamelContext camelContext) {

        }
    };
}

此外,在项目中使用骆驼超文本传输协议启动程序似乎也是一个问题,这是不推荐的,他们声称不建议使用。

因此,要么不为骆驼管理的bean执行DI(不管是通过属性还是构造函数注入),要么跳过启动程序。

 类似资料:
  • 我有一个带有自动扫描和@Component注释的Spring项目。一些组件需要使用@Autow的注入到不同的bean中。默认情况下,它是否将是作为单例创建的相同组件bean?如果是,如何将同一组件的不同实例注入不同的bean中? 附言:我知道它接近基础,听起来很一般。只是想自己说清楚。 提前致谢

  • 我有一个使用JDK 8、JSF 2.2(JBoss提供的实现)、Spring 4.2和Primeface 6.2开发的本地Web应用程序 在应用程序中,我有一个XHTML页面,用于编辑对象的一些字段,该对象是名为SiepRoEncabezado的类的实例。其中一个字段是Sieprpapaescador的一个实例。 直到昨天,我还有一个 在这里,tmpPescador是托管bean correcci

  • 与属性自动装配相比,构造函数自动装配有什么特殊的优势吗……或者普通的优势。?优于迫使团队在Spring启动中使用构造函数自动装配……它有什么特殊的优势吗?两种类型的自动装配的优缺点

  • 我有一个组件如下: 这是另一个类,我在哪里自动连接上面的类: 在上面的自动布线中,我需要使用参数化构造函数。如何传递构造函数参数?

  • 当我打开视图控制器时,我有一个从顶部飞出的视图。我已将UIView的Y约束设置为-200,当视图加载时,将调用以下内容,一切正常: 但是现在我有一个关闭按钮,它应该将动画回到-200位置,然后从屏幕上删除视图控制器。但是这个动画没有发生。视图控制器被直接删除。这是我正在做的: 我提到了这个链接。这似乎对他们有效,但对我无效。请帮忙。

  • 问题内容: 我对的反转如何在Spring。 假设我有一个称为服务的类,它实现了接口。 怎么会这样? 而在我,我怎么会在这个服务的? 我会做以下事情吗? 问题答案: 首先,也是最重要的一点-所有Spring Bean都受到管理-它们“实时”存在于称为“应用程序上下文”的容器中。 其次,每个应用程序都有一个指向该上下文的入口。Web应用程序具有Servlet,JSF使用el-resolver等。此外,