Spring integration Spring集成CSV文件到POJO转换器

Spring integration Spring集成CSV文件到POJO转换器,spring-integration,Spring Integration,在从jdbc出站适配器中的有效负载获取值时,我面临一些问题。详情如下 a) 使用int sftp:入站通道适配器从远程服务器下载csv文件 b) 。使用header enricher将文件名添加到标头 <int:transformer id="filetoPojoTransformer" input-channel="outputChannel" method="processContent" output-channel="fileOutputChannel" ref

在从jdbc出站适配器中的有效负载获取值时,我面临一些问题。详情如下

a) 使用int sftp:入站通道适配器从远程服务器下载csv文件

b) 。使用header enricher将文件名添加到标头

<int:transformer id="filetoPojoTransformer" input-channel="outputChannel" method="processContent"
          output-channel="fileOutputChannel" ref="FileToPOJOTransformer" />

c。使用自定义转换器将文件内容转换为POJO(使用openCSV库实现)


d) 变压器等级如下

public class FileToPOJOTransformer { 

    public List processContent(File file){   
            String[] columns = null;
            List<String> lines = null;
            List<Model1> list = null;

                try {
                    lines = Files.readAllLines(file.toPath(), 
                            StandardCharsets.UTF_8);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                columns = lines.get(0).split(",");              

                final ColumnPositionMappingStrategy<Model1> strategy = new ColumnPositionMappingStrategy<>();
                strategy.setType(Model1.class);
                strategy.setColumnMapping(columns);
                final CsvToBean<Model1> csvToBean = new CsvToBean<>();

                try (final Reader reader = new FileReader(file)) {
                    list = csvToBean.parse(strategy, reader);
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
        return list;
        }

}
公共类文件拓扑变压器{
公共列表processContent(文件){
String[]columns=null;
列表行=空;
List=null;
试一试{
lines=Files.readAllLines(file.toPath(),
标准字符集(UTF_8);
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
columns=lines.get(0).split(“,”);
final ColumnPositionMappingStrategy strategy=新ColumnPositionMappingStrategy();
strategy.setType(Model1.class);
策略.setColumnMapping(列);
最终CsvToBean CsvToBean=新CsvToBean();
try(最终读取器=新文件读取器(文件)){
list=csvToBean.parse(策略、读取器);
}捕获(IOEX异常){
抛出新的运行时异常(ex);
}
退货清单;
}
}
e) 使用路由器根据文件名委派到相应的通道

<int:recipient-list-router id="customRouter" input-channel="fileOutputChannel" default-output-channel="nullChannel">
       <int:recipient channel="channel1" selector-expression="headers['fileName'].startsWith('File1')"/>
       <int:recipient channel="channel2" selector-expression="headers['fileName'].startsWith('File2')"/>       
     </int:recipient-list-router>

f) 现在我必须将CSV的内容存储到数据库中,所以我使用了jdbc出站适配器

<int-jdbc:outbound-channel-adapter  
        id="jdbcOutBoundAdapterEndpoint1" channel="channel1"  
        query="insert into ImodiumTracking.ResponsesSent (Col1) 
        values(:payload.get(0).Col1)"
        data-source="dataSource">  
    </int-jdbc:outbound-channel-adapter> 

我尝试了不同的选项来获取bean值,但没有成功。如何从包含POJO列表的有效负载中获取jdbc出站适配器中的bean值

  • 表达
  • 显示您的
    列表的内容
  • 为什么不拆分
    列表
    将每个项目存储到数据库中
  • 试试这个:

    query="insert into ImodiumTracking.ResponsesSent (Col1) values(:payload[0].col1)"
    

    如果您的POJO有
    getCol1()

    谢谢Artem。您的解决方案适用于一条记录,但如何在有效负载中插入所有记录?我需要使用拆分还是有其他解决方案?请注意,csv中的所有记录都是类似类型的Yes,您确实应该在
    之前使用
    。然而,我发现我们可以使用
    batchUpdate(stringsql,SqlParameterSource[]batchArgs)
    来处理像您这样的情况。请随时就此事提出JIRA问题:如果我使用,则将根据记录数对我的数据库进行多次调用,这可能会产生性能问题。如果您在同一个发送中这样做,则不会产生太大影响。从另一方面,您可以直接从一些定制的
    服务激活器
    使用
    JdbcTemplate
    。正如我所说:我们还不支持批处理更新。这就是为什么我要你创建一张JIRA票,我们会处理好它的。我已经检查了URL“jira.spring.io/browse/INT”,但是没有创建票据的链接。你能给个建议吗?
    query="insert into ImodiumTracking.ResponsesSent (Col1) values(:payload[0].col1)"