以下に示すように定義されたjdbcインバウンド・チャネル・アダプターがあります。私はMySQLのdataSourceを使用しています。ポーリングされた行のステータスを更新したいと思います。私はこの文書に従おうとしています:spring integration ref. mannual。私の理解は、:idはSELECTクエリによって返されたすべてのidのセットにマップされるべきです。Spring統合InSerializableException 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
私はここで間違っていますか?
おそらく、mytableのクラスをSerializableインターフェイスのサブクラスとして持つことはできません。データオブジェクトは、データベースに永続化されるために、そのインタフェースを実装する必要があります。 – code4kix
正しい ':id'は' SqlParameterSource'のオブジェクトに対して単純に評価されるべきです。 'myRowMapper'が' getId() 'を使って適切なPOJOを返すことを確認しなければなりません。これは本当に後続のUPDATEにマップされる適切な型です。私たちはその情報を持っていないので、あなたを助けることはできません。 –
@ArtemBilanはい、私の答えで言及したように、問題は私のPOJOにありました。どうもありがとうございます :) –