Spring Boot自动配置对Apache Camel Bindy无效的问题解决咨询
Apache Camel Bindy CSV自动配置属性不生效问题
问题描述
unwrapSingleInstance属性用于控制CSV解组时返回单个实例还是包装在java.util.List中。但Spring Boot的自动配置属性camel.dataformat.bindy-csv.unwrap-single-instance对以下代码无作用:
BindyCsvDataFormat bindy = new BindyCsvDataFormat(com.acme.model.MyModel.class); from("file://inbox") .unmarshal(bindy) .to("direct:handleOrders");
只有直接调用bindy.setUnwrapSingleInstance(false);才能生效,推测原因是手动new的BindyCsvDataFormat对象不受Spring管理。
已尝试无效的方案
通过Spring创建常规Bean并引用,自动配置依然不生效:
@Bean public DataFormat bindyCsvDataFormat() { return new BindyCsvDataFormat(com.acme.model.MyModel.class); } from("file://inbox") .unmarshal("bindyCsvDataFormat") .to("direct:handleOrders");
环境信息
- Apache Camel版本:
3.20.5 - 依赖配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-bindy-starter</artifactId> </dependency>
有效解决方案
方案1:借助BindyCsvDataFormatBuilder构建Bean
利用Camel提供的Builder类创建Bean,Spring会自动绑定配置文件中的属性:
@Bean public BindyCsvDataFormat bindyCsvDataFormat(BindyCsvDataFormatBuilder builder) { return builder.type(com.acme.model.MyModel.class).build(); }
路由中直接引用该Bean:
from("file://inbox") .unmarshal("bindyCsvDataFormat") .to("direct:handleOrders");
方案2:配置文件指定模型类
在application.properties(或application.yml)中配置模型类和属性:
camel.dataformat.bindy-csv.type=com.acme.model.MyModel camel.dataformat.bindy-csv.unwrap-single-instance=false
路由中直接使用预设的dataformat:
from("file://inbox") .unmarshal("bindy-csv") .to("direct:handleOrders");
或者通过类型指定:
from("file://inbox") .unmarshal().bindyCsv(com.acme.model.MyModel.class) .to("direct:handleOrders");
原理说明
Camel Starter的自动配置逻辑会通过BindyCsvDataFormatBuilder根据配置文件属性构建BindyCsvDataFormat实例,只有这种方式创建的Bean才会被Spring管理并自动注入配置。手动new的实例不会触发自动配置的属性绑定流程。
内容的提问来源于stack exchange,提问作者lcnicolau
相关产品推荐
相关产品推荐

