Как сохранить элементы JSON не верхнего уровня в столбцах таблицы с помощью Spring XD JDBC приемника?

У меня есть следующая структура данных

{
 metadata: {
     eventId:string
     eventName: string
     ts: date time string
    . . .
},
 data:{
   // complex event payload
 }
}

Я получаю эти события из шины сообщений, и мне нужно записать сообщение в реляционную таблицу со следующими столбцами

eventId | eventName | ts(объект Date) | полезная нагрузка

Как мне достичь этих целей в Spring XD?

  1. сохранить элементы без верхнего уровня в несколько столбцов
  2. преобразовать 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 данные, поэтому вам не нужно указывать их.

Другие вопросы по тегам