Верблюд JDBC и опция выходного класса
Я хочу читать из БД и создать файл CSV. Для этого я использую camel-jdbc и camel-bindy.
Сначала я установил тело с помощью инструкции SELECT.
SELECT [vendor],
[ean],
[itemid] AS itemId,
[quantity]
FROM [dbo].[ElectronicDeliveryNotes]
тогда я вызываю компонент JDBC
<to uri="jdbc:dataSource?outputType=SelectList&outputClass=com.xxx.Model"/>
Это вернет список моделей. Модель класса
@CsvRecord(separator = ";", generateHeaderColumns = true, crlf = "UNIX")
public class Model2 {
@DataField(pos = 1, columnName = "A_Liererant")
private String vendor;
@DataField(pos = 2, columnName = "F_EAN")
private String ean;
@DataField(pos = 3, columnName = "G_Lief. Artikelnummer")
private String itemId;
@DataField(pos = 4, columnName = "H_Menge")
private BigDecimal quantity;
//getters setters
Я получаю следующую ошибку:
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}
Насколько я понимаю, проблема заключается в именовании свойств модели. Одно из решений, которое я пробовал и работало, - переименовать Model itemId => itemid. Это будет работать, но я не использую соглашения об именах Java.
Знаете ли вы, как преодолеть это без переименования свойств?
Я также попробовал следующее, но это не сработало.
@DataField(pos = 3, columnName = "G_Lief. Artikelnummer", name = "itemid")
private String itemId;
1 ответ
Я не видел ничего плохого в вашей структуре кода.
Если вы хотите получить из таблицы и экспортировать результаты в CSV на основе вашего Model2
класс, я могу предложить использовать 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
:
Использовать пользовательский org.apache.camel.component.jdbc.BeanRowMapper при использовании outputClass. Реализация по умолчанию будет в нижнем регистре имен строк и пропустить подчеркивания и тире. Например, "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
,