У меня есть требование, когда я должен читать из двух разных источников, один из файла, а другой из БД, выполнять некоторые операции в агрегаторе, а затем записывать вывод в файл.
Я могу прочитать файл, но после чтения файла из базы данных мне нужно преобразовать файл в bean-компонент. А я не умею.
Ниже мой код:
Маршрут:
from("file:{{InputFileDir1}}?noop=true")
.routeId("readInputFiles")
.unmarshal()
.bindy(BindyType.Csv,Job9.class)
.enrich("direct:resource", batchLogRecords)
.marshal()
.bindy(BindyType.Csv, ClubbedJob.class)
.to("file:{{OutPutDir}}?fileName={{FinalJoinedFile}}")
.log(LoggingLevel.INFO,"Left Join Complete")
.end();
from("direct:resource")
.setBody(simple("SELECT D.DC LOC,D.DEPT,D.CLASS as CLAS,D.ITEM,D.ITEM_CSPK, 'P' as Dummy FROM db2prod.ITEM_DC D,db2prod.FRTB_ITEM_W E WHERE D.DEPT=E.DEPT AND D.CLASS=E.CLASS AND D.ITEM=E.ITEM AND D.DC_I=E.LOC AND E.ALOC_PRCS='9987' with ur;"))
.to("jdbc:dataSourceDB2?outputClass=com.tgt.fff.beans.LookUpJob9")
.process(convertToObject)
.end();
Приведенный выше маршрут считывает файл и обогащает набор результатов, возвращаемый запросом, путем преобразования в объект.
.to("jdbc:dataSourceDB2?outputClass=com.tgt.fff.beans.LookUpJob9")
LookUpJob9.java
@Component
public class LookUpJob9 {
CompositeKey compositeKey;
String itemCspk;
String dummy;
--------getters & setters-----------
}
CompositeKey — это класс, который содержит 4 поля, содержащие составной ключ.
Теперь проблема в том, что атрибут outputClass не может выполнить глубокое сопоставление. Он может отображать itemCspk и dummy, но не может отображать поля внутри класса CompositeKey.
Я получаю следующее исключение:
java.lang.IllegalArgumentException: Cannot map all properties to bean of type class com.tgt.fff.beans.LookUpJob9. There are 4 unmapped properties. {locI=553, deptI=2, clasI=0, itemI=3}
at org.apache.camel.component.jdbc.JdbcProducer.newBeanInstance(JdbcProducer.java:397) ~[camel-jdbc-2.18.2.jar:2.18.2]
at org.apache.camel.component.jdbc.JdbcProducer.extractRows(JdbcProducer.java:350) ~[camel-jdbc-2.18.2.jar:2.18.2]
at org.apache.camel.component.jdbc.JdbcProducer.setResultSet(JdbcProducer.java:332) ~[camel-jdbc-2.18.2.jar:2.18.2]
at org.apache.camel.component.jdbc.JdbcProducer.doCreateAndExecuteSqlStatement(JdbcProducer.java:225) ~[camel-jdbc-2.18.2.jar:2.18.2]
at org.apache.camel.component.jdbc.JdbcProducer.createAndExecuteSqlStatement(JdbcProducer.java:125) ~[camel-jdbc-2.18.2.jar:2.18.2]
at org.apache.camel.component.jdbc.JdbcProducer.processingSqlBySettingAutoCommit(JdbcProducer.java:86) ~[camel-jdbc-2.18.2.jar:2.18.2]
at org.apache.camel.component.jdbc.JdbcProducer.process(JdbcProducer.java:67) ~[camel-jdbc-2.18.2.jar:2.18.2]
at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61) ~[camel-core-2.18.2.jar:2.18.2]
at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145) ~[camel-core-2.18.2.jar:2.18.2]
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77) [camel-core-2.18.2.jar:2.18.2]
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:542) [camel-core-2.18.2.jar:2.18.2]
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197) [camel-core-2.18.2.jar:2.18.2]
at org.apache.camel.processor.Pipeline.process(Pipeline.java:120) [camel-core-2.18.2.jar:2.18.2]
at org.apache.camel.processor.Pipeline.process(Pipeline.java:83) [camel-core-2.18.2.jar:2.18.2]
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197) [camel-core-2.18.2.jar:2.18.2]
at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:62) [camel-core-2.18.2.jar:2.18.2]
at org.apache.camel.processor.Enricher.process(Enricher.java:187) [camel-core-2.18.2.jar:2.18.2]
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77) [camel-core-2.18.2.jar:2.18.2]
Когда я использую вышеупомянутый класс с bindy, я использую @Link с классом CompositeKey, чтобы связать их. Есть ли аналогичный способ, с помощью которого я могу добиться этого с помощью JDBC.