Apache camel camel jdbc和outputClass选项

Apache camel camel jdbc和outputClass选项,apache-camel,bindy,camel-jdbc,Apache Camel,Bindy,Camel Jdbc,我想从数据库中读取并创建一个CSV文件。为了做到这一点,我使用了camel-jdbc和camel-bindy 首先,我用SELECT语句设置主体 SELECT [vendor], [ean], [itemid] AS itemId, [quantity] FROM [dbo].[ElectronicDeliveryNotes] 然后我调用jdbc组件 <to uri="jdbc:dataSource?outputType=SelectLi

我想从数据库中读取并创建一个CSV文件。为了做到这一点,我使用了camel-jdbc和camel-bindy

首先,我用SELECT语句设置主体

SELECT  [vendor],
        [ean],
        [itemid] AS itemId,
        [quantity]
FROM [dbo].[ElectronicDeliveryNotes]
然后我调用jdbc组件

<to uri="jdbc:dataSource?outputType=SelectList&amp;outputClass=com.xxx.Model"/> 
我得到以下错误:

java.lang.IllegalArgumentException: Cannot map all properties to bean of type class com.xxx.Model2. There are 1 unmapped properties. {itemid=11.0441-5402.2}
据我所知,问题在于模型属性的命名。我尝试并使用的一个解决方案是重命名模型itemId=>itemId。这将起作用,但我不使用Java命名约定

您知道如何在不重命名属性的情况下克服此问题吗

我也尝试了以下方法,但没有成功

 @DataField(pos = 3, columnName = "G_Lief. Artikelnummer", name = "itemid")
    private String itemId;

我没发现你的代码结构有什么问题

如果您想要完成的是从表中检索并基于Model2类将其结果导出到CSV,我建议使用camel sql。可能是这样的:

@Override
protected RoutesBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {

        @Override
        public void configure() throws Exception {
            getContext().getComponent("sql", SqlComponent.class).setDataSource(db);
            BindyCsvDataFormat camelDataFormat = new BindyCsvDataFormat(Model2.class);

            from("sql:select vendor, ean, itemid as itemId, quantity from ElectronicDeliveryNotes?outputType=SelectList&outputClass=com....model.Model2")
                    .marshal(camelDataFormat)
                    .log("the body:\n${body}")
                    .to("mock:result");
        }
    };
}
您轮询表中的数据,对其进行整理,然后将消息发送到其他队列。我已经运行了一些测试,以确保查询结果可以转换为CSV,并且只要您保持字段的名称等于您的属性,就不会出现任何问题。旁注:在我的测试中,即使没有别名,一切都很顺利

但是,在测试代码时,我也犯了同样的错误。也许您需要实现beanRowMapper:

在使用outputClass时使用自定义org.apache.camel.component.jdbc.BeanRowMapper。默认实现将行名称小写,并跳过下划线和破折号。例如,CUST_ID被映射为custId

我猜这就是你陷入这个错误的原因:

java.lang.IllegalArgumentException: Cannot map all properties to bean of type class com.xxx.Model2. There are 1 unmapped properties. {itemid=11.0441-5402.2}

尝试将您的别名重命名为ITEM_ID。

我正在尝试了解您要执行的操作。您是否正在尝试从表中读取数据并将其结果导出到CSV文件?当执行路由时,您会在上面看到这个错误吗?我的理解正确吗?如果是这样,我可以建议另一种方法吗?是的,我正在尝试从db读取记录并创建csv文件。错误发生在jdbc执行时。正如在描述中提到的,它无法映射属性itemId,因此在模型类中将其重命名为itemId是一种可能的解决方案,但我想问是否有一种方法可以使用java名称约定而不重命名属性。你有什么想法吗?你可以使用骆驼sql。看看我的答案。稍后我将看一看camel jdbc替代方案,以更接近您的问题。非常感谢!beanRowMapper是jdbc组件中的一个选项,所以我必须提供一个自定义实现,或者如您所说,将collumn别名为ITEM_ID,或者只是命名为java类属性itemid。耶!但如果你接受一个建议,我认为只有将你的别名重命名为ITEM_ID可能更可靠。是的,有3个选项,别名方法正如你所说的更可靠!再次感谢
java.lang.IllegalArgumentException: Cannot map all properties to bean of type class com.xxx.Model2. There are 1 unmapped properties. {itemid=11.0441-5402.2}