spring集成:使用jdbc出站网关在数据库中插入记录时出错

42fyovps  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(394)

我试图用jdbc出站网关在mysql数据库中插入数据,但是出现了这个错误
嵌套异常为java.sql.sqlexception:参数值无效:java.io.notserializableexception
app-config.xml无效

<int-jdbc:inbound-channel-adapter
        id="jdbcExtractor" 
        data-source="dataSource"
        query="select * from Persons"
        row-mapper="personRowMapeer" 
        channel="dataChannel">

        <int:poller 
                fixed-delay="10000">
            </int:poller>
    </int-jdbc:inbound-channel-adapter>

<int:service-activator id="beanParser" input-channel="dataChannel" output-channel="JdbcChannel" ref="extractData" method="extractJdbcData" ></int:service-activator>

<int:channel id="JdbcChannel"></int:channel>
<int:channel id="testReply"></int:channel>

<int-jdbc:outbound-gateway 
    request-channel="JdbcChannel" 
    reply-channel="testReply"
        request-sql-parameter-source-factory="requestSource"
        reply-sql-parameter-source-factory="replySource" 
            data-source="dataSource" 
                update="insert into Persons (PersonID,LastName,FirstName,Address,City) values (:PersonID, :LastName, :FirstName, :Address, :City)"
                    query="select * from Persons where PersonID = :PersonID"
                    id="outboundInsert" >
</int-jdbc:outbound-gateway>

<bean id="personRowMapeer" class="com.example.SpringIntegrationDemo.test.PersonRowMapper"></bean>

<bean name="extractData" class="com.example.SpringIntegrationDemo.test.ExtractData"></bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost/demo" />
    <property name="username" value="*****" />
    <property name="password" value="*****" />
</bean>

<bean id="requestSource" class="org.springframework.integration.jdbc.ExpressionEvaluatingSqlParameterSourceFactory">
<property name="parameterExpressions">
    <map>
        <entry key="PersonID" value="payload.personId"/>
        <entry key="LastName" value="payload.lastName"/>
        <entry key="FirstName" value="payload.firstName"/>
        <entry key="Address" value="payload.address" />
        <entry key="City" value="payload.city" />
    </map>
</property>
</bean>

 <bean id="replySource" class="org.springframework.integration.jdbc.ExpressionEvaluatingSqlParameterSourceFactory">
<property name="parameterExpressions">
    <map>
        <entry key="PersonID" value="payload.personId"/>
    </map>
</property>     
</bean>

提取器等级:

public class ExtractData implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -6405067378057426543L;

    public PersonVo extractJdbcData(List<PersonVo> personVos)  {

        System.out.println("Printing the result set "+personVos.size());
        return personVos.get(3);        

    }

}

我在代码后面添加了可序列化部分。行Map器已就位。
下面是完整的堆栈跟踪

2018-08-20 22:43:04.032  INFO 9086 --- [           main] c.e.S.SpringIntegrationDemoApplication   : Starting SpringIntegrationDemoApplication on pratik-HP-Pavilion-g6-Notebook-PC with PID 9086 (/home/pratik/Documents/workspace-sts-3.9.5.RELEASE/SpringIntegrationDemo/target/classes started by pratik in /home/pratik/Documents/workspace-sts-3.9.5.RELEASE/SpringIntegrationDemo)
2018-08-20 22:43:04.036  INFO 9086 --- [           main] c.e.S.SpringIntegrationDemoApplication   : No active profile set, falling back to default profiles: default
2018-08-20 22:43:04.097  INFO 9086 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@143640d5: startup date [Mon Aug 20 22:43:04 IST 2018]; root of context hierarchy
2018-08-20 22:43:04.424  INFO 9086 --- [           main] o.s.b.f.xml.XmlBeanDefinitionReader      : Loading XML bean definitions from URL [file:/home/pratik/Documents/workspace-sts-3.9.5.RELEASE/SpringIntegrationDemo/target/classes/app-config.xml]
2018-08-20 22:43:04.704  INFO 9086 --- [           main] o.s.i.config.IntegrationRegistrar        : No bean named 'integrationHeaderChannelRegistry' has been explicitly defined. Therefore, a default DefaultHeaderChannelRegistry will be created.
2018-08-20 22:43:05.201  INFO 9086 --- [           main] faultConfiguringBeanFactoryPostProcessor : No bean named 'errorChannel' has been explicitly defined. Therefore, a default PublishSubscribeChannel will be created.
2018-08-20 22:43:05.203  INFO 9086 --- [           main] faultConfiguringBeanFactoryPostProcessor : No bean named 'taskScheduler' has been explicitly defined. Therefore, a default ThreadPoolTaskScheduler will be created.
2018-08-20 22:43:05.454  INFO 9086 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$978e7c27] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2018-08-20 22:43:05.559  INFO 9086 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.integration.config.IntegrationManagementConfiguration' of type [org.springframework.integration.config.IntegrationManagementConfiguration$$EnhancerBySpringCGLIB$$2803756] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2018-08-20 22:43:05.794  INFO 9086 --- [           main] o.s.s.c.ThreadPoolTaskScheduler          : Initializing ExecutorService  'taskScheduler'
2018-08-20 22:43:05.888  INFO 9086 --- [           main] o.s.j.d.DriverManagerDataSource          : Loaded JDBC driver: com.mysql.jdbc.Driver
2018-08-20 22:43:06.659  INFO 9086 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2018-08-20 22:43:06.671  INFO 9086 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Starting beans in phase 0
2018-08-20 22:43:06.672  INFO 9086 --- [           main] o.s.i.endpoint.EventDrivenConsumer       : Adding {service-activator:beanParser} as a subscriber to the 'dataChannel' channel
2018-08-20 22:43:06.672  INFO 9086 --- [           main] o.s.integration.channel.DirectChannel    : Channel 'application.dataChannel' has 1 subscriber(s).
2018-08-20 22:43:06.672  INFO 9086 --- [           main] o.s.i.endpoint.EventDrivenConsumer       : started beanParser
2018-08-20 22:43:06.672  INFO 9086 --- [           main] o.s.i.endpoint.EventDrivenConsumer       : Adding {jdbc:outbound-gateway:outboundInsert} as a subscriber to the 'JdbcChannel' channel
2018-08-20 22:43:06.672  INFO 9086 --- [           main] o.s.integration.channel.DirectChannel    : Channel 'application.JdbcChannel' has 1 subscriber(s).
2018-08-20 22:43:06.672  INFO 9086 --- [           main] o.s.i.endpoint.EventDrivenConsumer       : started outboundInsert
2018-08-20 22:43:06.672  INFO 9086 --- [           main] o.s.i.endpoint.EventDrivenConsumer       : Adding {logging-channel-adapter:_org.springframework.integration.errorLogger} as a subscriber to the 'errorChannel' channel
2018-08-20 22:43:06.673  INFO 9086 --- [           main] o.s.i.channel.PublishSubscribeChannel    : Channel 'application.errorChannel' has 1 subscriber(s).
2018-08-20 22:43:06.673  INFO 9086 --- [           main] o.s.i.endpoint.EventDrivenConsumer       : started _org.springframework.integration.errorLogger
2018-08-20 22:43:06.673  INFO 9086 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Starting beans in phase 1073741823
2018-08-20 22:43:06.676  INFO 9086 --- [           main] o.s.i.e.SourcePollingChannelAdapter      : started jdbcExtractor
2018-08-20 22:43:06.691  INFO 9086 --- [           main] c.e.S.SpringIntegrationDemoApplication   : Started SpringIntegrationDemoApplication in 2.993 seconds (JVM running for 3.91)
Printing the result set 8
2018-08-20 22:43:06.755  INFO 9086 --- [ask-scheduler-1] o.s.b.f.xml.XmlBeanDefinitionReader      : Loading XML bean definitions from class path resource [org/springframework/jdbc/support/sql-error-codes.xml]
2018-08-20 22:43:06.830 ERROR 9086 --- [ask-scheduler-1] o.s.integration.handler.LoggingHandler   : org.springframework.messaging.MessageHandlingException: error occurred in message handler [org.springframework.integration.jdbc.JdbcOutboundGateway#0]; nested exception is org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [insert into Persons (PersonID,LastName,FirstName,Address,City) values (?, ?, ?, ?, ?)Invalid argument value: java.io.NotSerializableException; nested exception is java.sql.SQLException: Invalid argument value: java.io.NotSerializableException, failedMessage=GenericMessage [payload=com.example.SpringIntegrationDemo.vo.PersonVo@158c1a9d, headers={id=3be9637d-1c7a-fb51-e416-438fd8ab9e41, timestamp=1534785186707}]
    at org.springframework.integration.support.utils.IntegrationUtils.wrapInHandlingExceptionIfNecessary(IntegrationUtils.java:184)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:175)
    at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:132)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:105)
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:73)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:445)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:394)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:181)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:160)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:47)
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:108)
    at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:426)
    at org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:336)
    at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:227)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:115)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:158)
    at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:132)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:105)
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:73)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:445)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:394)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:181)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:160)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:47)
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:108)
    at org.springframework.integration.endpoint.SourcePollingChannelAdapter.handleMessage(SourcePollingChannelAdapter.java:227)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.doPoll(AbstractPollingEndpoint.java:290)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller.lambda$run$0(AbstractPollingEndpoint.java:391)
    at org.springframework.integration.util.ErrorHandlingTaskExecutor.lambda$execute$0(ErrorHandlingTaskExecutor.java:57)
    at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
    at org.springframework.integration.util.ErrorHandlingTaskExecutor.execute(ErrorHandlingTaskExecutor.java:55)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller.run(AbstractPollingEndpoint.java:385)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [insert into Persons (PersonID,LastName,FirstName,Address,City) values (?, ?, ?, ?, ?)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:110)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
    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.translateException(JdbcTemplate.java:1402)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:620)
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:850)
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:871)
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:317)
    at org.springframework.integration.jdbc.JdbcMessageHandler.executeUpdateQuery(JdbcMessageHandler.java:198)
    at org.springframework.integration.jdbc.JdbcOutboundGateway.handleRequestMessage(JdbcOutboundGateway.java:136)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:109)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:158)
    ... 41 more
Caused by: java.sql.SQLException: Invalid argument value: java.io.NotSerializableException
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
    at com.mysql.jdbc.PreparedStatement.setSerializableObject(PreparedStatement.java:4414)
    at com.mysql.jdbc.PreparedStatement.setObject(PreparedStatement.java:4085)
    at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:411)
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:232)
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:147)
    at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.setValues(PreparedStatementCreatorFactory.java:278)
    at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.createPreparedStatement(PreparedStatementCreatorFactory.java:236)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:603)
    ... 48 more
Caused by: java.io.NotSerializableException: java.lang.Object
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at com.mysql.jdbc.PreparedStatement.setSerializableObject(PreparedStatement.java:4403)
    ... 55 more

我是不是做错了什么?

zhte4eai

zhte4eai1#

问题不在于整体 ExtractData 甚至是它的 PersonVo . 你的参数有问题 INSERT :

<entry key="PersonID" value="payload.personId"/>
    <entry key="LastName" value="payload.lastName"/>
    <entry key="FirstName" value="payload.firstName"/>
    <entry key="Address" value="payload.address" />
    <entry key="City" value="payload.city" />

其中一些值是从 PersonVo 与到jdbc类型的普通转换不兼容。

相关问题