2016-09-23 188 views
0

我有一個jdbc入站通道適配器,它的定義如下所示。我正在使用MySQL數據源。我想更新已經輪詢的行的狀態。我試圖按照這個文件:spring integration ref. mannual。我的理解是:id應該映射到由SELECT查詢返回的所有id的集合。Spring集成NotSerializableException對jdbc入站通道適配器更新查詢

<int-jdbc:inbound-channel-adapter 
    channel="targetChannel" data-source="dataSource" 
    query="SELECT * FROM mytable WHERE status=''" row-mapper="myRowMapper" 
    max-rows-per-poll="500" 
    update="UPDATE mytable SET status='IN_PROGRESS' WHERE id in (:id)"> 
    <int:poller fixed-delay="60000" /> 
</int-jdbc:inbound-channel-adapter> 

的SELECT查詢執行很好,我要確保所有結果行通過RowMapper的映射如預期,但同時,它會嘗試使用給定UPDATE查詢來更新,我得到以下異常:

2016-09-23 14:57:29.361 ERROR 15580 --- [task-scheduler-1] o.s.integration.handler.LoggingHandler : org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [UPDATE mytable SET status='IN_PROGRESS' WHERE id in (?)]; Invalid argument value: java.io.NotSerializableException; nested exception is java.sql.SQLException: Invalid argument value: java.io.NotSerializableException 
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:108) 
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) 
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:649) 
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:870) 
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:894) 
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:287) 
at org.springframework.integration.jdbc.JdbcPollingChannelAdapter.executeUpdateQuery(JdbcPollingChannelAdapter.java:181) 
at org.springframework.integration.jdbc.JdbcPollingChannelAdapter.poll(JdbcPollingChannelAdapter.java:173) 
at org.springframework.integration.jdbc.JdbcPollingChannelAdapter.receive(JdbcPollingChannelAdapter.java:149) 
at org.springframework.integration.endpoint.SourcePollingChannelAdapter.receiveMessage(SourcePollingChannelAdapter.java:209) 
at org.springframework.integration.endpoint.AbstractPollingEndpoint.doPoll(AbstractPollingEndpoint.java:245) 
at org.springframework.integration.endpoint.AbstractPollingEndpoint.access$000(AbstractPollingEndpoint.java:58) 
at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:190) 
at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:186) 
at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller$1.run(AbstractPollingEndpoint.java:353) 
at org.springframework.integration.util.ErrorHandlingTaskExecutor$1.run(ErrorHandlingTaskExecutor.java:55) 
at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50) 
at org.springframework.integration.util.ErrorHandlingTaskExecutor.execute(ErrorHandlingTaskExecutor.java:51) 
at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller.run(AbstractPollingEndpoint.java:344) 
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) 
at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81) 
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) 
at java.util.concurrent.FutureTask.run(Unknown Source) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(Unknown Source) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 
Caused by: java.sql.SQLException: Invalid argument value: java.io.NotSerializableException 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:963) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860) 
at com.mysql.jdbc.PreparedStatement.setSerializableObject(PreparedStatement.java:3829) 
at com.mysql.jdbc.PreparedStatement.setObject(PreparedStatement.java:3559) 
at com.mysql.jdbc.JDBC42PreparedStatement.setObject(JDBC42PreparedStatement.java:68) 
at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:440) 
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:235) 
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:150) 
at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.setValues(PreparedStatementCreatorFactory.java:292) 
at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.createPreparedStatement(PreparedStatementCreatorFactory.java:244) 
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:627) 
... 25 more 
Caused by: java.io.NotSerializableException: java.lang.Object 
at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
at java.io.ObjectOutputStream.writeObject(Unknown Source) 
at com.mysql.jdbc.PreparedStatement.setSerializableObject(PreparedStatement.java:3818) 
... 33 more 

我在這裏做錯了什麼?

+0

您可能沒有將mytable的類作爲Serializable接口的子類。數據對象必須實現該接口才能保存到數據庫中。 – code4kix

+0

正確的':id'應該簡單地根據'SqlParameterSource'中的對象進行評估。你必須確定你的'myRowMapper'用'getId()'返回了正確的POJO,這個類型是真正適合映射到後續UPDATE的類型。由於我們沒有這些信息,我們無法幫助您。 –

+0

@ArtemBilan是的,問題出現在我的POJO中,就像我在回答中提到的一樣。非常感謝 :) –

回答

0

發現我的錯誤,感謝Artem Bilan。我認爲:id會映射到SELECT結果集的列名中的「id」,而不是POJO上的getId()。我的RowMapper將POJO中的「id」映射爲「requestId」。那是錯誤的。

相關問題