Как сохранить элементы JSON не верхнего уровня в столбцах таблицы с помощью Spring XD JDBC приемника?
У меня есть следующая структура данных
{
metadata: {
eventId:string
eventName: string
ts: date time string
. . .
},
data:{
// complex event payload
}
}
Я получаю эти события из шины сообщений, и мне нужно записать сообщение в реляционную таблицу со следующими столбцами
eventId | eventName | ts(объект Date) | полезная нагрузка
Как мне достичь этих целей в Spring XD?
- сохранить элементы без верхнего уровня в несколько столбцов
- преобразовать metadata.ts в объект даты СУБД
Я думал что-то вроде этого.
jms | jdbc --columns = payload.metadata.eventId, payload.metadata.eventName, someMagicFunction (payload.metadata.ts), полезная нагрузка
Но это выкидывало некоторые ошибки в HSQLDB.
2016-09-28T07:06:41-0700 WARN JMS Session Delivery Thread - $TMPAPPID$112880967$$SESSION$0:4720332838885165348 listener.SimpleMessageListenerContainer - Execution of JMS message listener failed, and no ErrorHandler has been set.
org.springframework.messaging.MessageHandlingException: error occurred in message handler [org.springframework.integration.jdbc.JdbcMessageHandler#0]; nested ex
ception is org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [insert into ces_test5 (payload.metadata.eventId, payload
.metadata.eventName, payload
.metadata.ts, payload) values(?, ?, ?)]; nested exception is java.sql.SQLSyntaxErrorException: too many identifier parts: PAYLOAD
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:139) ~[spring-integration-core-4.2.5.RELEASE
.jar:na]
at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116) ~[spring-integration-core-4.2.5.RELEA
SE.jar:na]
at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:147) ~[spring-integration-core-4.2.5.RELEASE.jar
:na]
at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:120) ~[spring-integration-core-4.2.5.RELEASE.jar:n
a]
at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:77) ~[spring-integration-core-4.2.5.RELEA
SE.jar:na]
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:442) ~[spring-integration-core-4.2.5.RELEASE.jar:na]
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:392) ~[spring-integration-core-4.2.5.RELEASE.jar:na]
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115) ~[spring-messaging-4.2.4.RELEASE.jar:4.2.4.RELE
ASE]
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:45) ~[spring-messaging-4.2.4.RELEASE.jar:4.2.4.RELEA
Возможно ли вообще сохранение #1 (сохранение элементов без верхнего уровня в нескольких столбцах)?
1 ответ
Что происходит, когда вы явно не указываете полезную нагрузку при обращении к именам столбцов здесь:
jms|jdbc --columns=metadata.eventId,metadata.eventName,someMagicFunction(metadata.ts),payload
Приемник JDBC работает на payload
данные, поэтому вам не нужно указывать их.