Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java配置中正确定义Spring集成JpaOutboundGateway?_Java_Spring_Jpa_Spring Integration - Fatal编程技术网

如何在Java配置中正确定义Spring集成JpaOutboundGateway?

如何在Java配置中正确定义Spring集成JpaOutboundGateway?,java,spring,jpa,spring-integration,Java,Spring,Jpa,Spring Integration,我试图用JavaConfig替换Spring集成XML配置,但我无法正确定义JpaOutboundGateway。在XML中,我有以下bean定义: <int-jpa:outbound-channel-adapter id="saveOffer" entity-manager-factory="entityManagerFactory" channel="channel5" flush-size="100" entity-

我试图用JavaConfig替换Spring集成XML配置,但我无法正确定义JpaOutboundGateway。在XML中,我有以下bean定义:

<int-jpa:outbound-channel-adapter id="saveOffer" entity-manager-factory="entityManagerFactory" channel="channel5"
                                  flush-size="100" entity-class="JobOffer">
    <int-jpa:transactional transaction-manager="transactionManager"/>
</int-jpa:outbound-channel-adapter>
我试图在JpaExecutor中使用EntityManager和EntityManager工厂。但在这两种情况下都会引发异常:

2016-09-03 09:20:42.440 ERROR o.s.integration.handler.LoggingHandler  : org.springframework.messaging.MessageHandlingException: error occurred in message handler [org.springframework.integration.jpa.outbound.JpaOutboundGateway@1fc306d3]; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'merge' call
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:139)
    at org.springframework.integration.endpoint.PollingConsumer.handleMessage(PollingConsumer.java:129)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.doPoll(AbstractPollingEndpoint.java:272)
    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(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:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'merge' call
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:282)
    at com.sun.proxy.$Proxy121.merge(Unknown Source)
    at org.springframework.integration.jpa.core.DefaultJpaOperations.persistOrMerge(DefaultJpaOperations.java:248)
    at org.springframework.integration.jpa.core.DefaultJpaOperations.merge(DefaultJpaOperations.java:215)
    at org.springframework.integration.jpa.core.JpaExecutor.executeOutboundJpaOperation(JpaExecutor.java:253)
    at org.springframework.integration.jpa.outbound.JpaOutboundGateway.handleRequestMessage(JpaOutboundGateway.java:81)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:109)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127)
    ... 19 more

这是需要连接的更复杂的端点之一;我们需要在参考手册中添加一个Java配置示例;我开了一家商店

你可以随时查看,看看需要什么

特别是:

  • JpaExecutor
    应定义为
    @Bean
  • 您需要向适配器的
    txAdviceChain
    添加事务建议
  • 您可以查看
    IntegrationNamespaceUtils.configureTransactionaAttribute
    ,查看将事务建议(事务属性、属性源、TM等)连接到
    TransactionInterceptor中所需的内容
  • 我的“丑陋但有效”版本:

    @Bean
    公共JpaExecutor JpaExecutor(){
    JpaExecutor executor=新的JpaExecutor(entityManagerFactory);
    执行器。setFlushSize(10);
    executor.setEntityClass(JobOffer.class);
    返还执行人;
    }
    @豆子
    @ServiceActivator(inputChannel=“channel5”)
    公共JpaOutboundGateway保存(JpaExecutor JpaExecutor,PlatformTransactionManager transactionManager)引发异常{
    DefaultTransactionAttribute dta=新的DefaultTransactionAttribute();
    dta.setPropagationBehavior(TransactionDefinition.PROPAGATION\u需要\u NEW);
    dta.setReadOnly(错误);
    MatchAlwaysTransactionAttributeSource matas=新的MatchAlwaysTransactionAttributeSource();
    matas.setTransactionAttribute(dta);
    TransactionInterceptor ic=新TransactionInterceptor();
    ic.setTransactionManager(transactionManager);
    ic.setTransactionAttributeSource(matas);
    List adviceChain=new ArrayList();
    adviceChain.add(ic);
    JpaOutboundGateway=新的JpaOutboundGateway(jpaExecutor);
    gateway.setAdviceChain(adviceChain);
    gateway.setProducesReply(false);
    返回网关;
    }
    
    谢谢您的回答。在这里提问之前,我曾试图分析XML解析器,但我不理解这些事务建议链的内容。。。但也许有了你的建议,我会让它发挥作用。我的“丑陋但有效”版本在下一个答案中。我承认这远不如我所期望的那么直观……使用XML的一个好处当然是——解析器为您做了很多事情。对于java配置,当我们向添加JPA支持时,它将更易于配置。DSL正在5.0版的主项目中推出。
    2016-09-03 09:20:42.440 ERROR o.s.integration.handler.LoggingHandler  : org.springframework.messaging.MessageHandlingException: error occurred in message handler [org.springframework.integration.jpa.outbound.JpaOutboundGateway@1fc306d3]; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'merge' call
        at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:139)
        at org.springframework.integration.endpoint.PollingConsumer.handleMessage(PollingConsumer.java:129)
        at org.springframework.integration.endpoint.AbstractPollingEndpoint.doPoll(AbstractPollingEndpoint.java:272)
        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(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:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
    Caused by: javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'merge' call
        at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:282)
        at com.sun.proxy.$Proxy121.merge(Unknown Source)
        at org.springframework.integration.jpa.core.DefaultJpaOperations.persistOrMerge(DefaultJpaOperations.java:248)
        at org.springframework.integration.jpa.core.DefaultJpaOperations.merge(DefaultJpaOperations.java:215)
        at org.springframework.integration.jpa.core.JpaExecutor.executeOutboundJpaOperation(JpaExecutor.java:253)
        at org.springframework.integration.jpa.outbound.JpaOutboundGateway.handleRequestMessage(JpaOutboundGateway.java:81)
        at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:109)
        at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127)
        ... 19 more
    
    @Bean
    public JpaExecutor jpaExecutor() {
    
        JpaExecutor executor = new JpaExecutor(entityManagerFactory);
        executor.setFlushSize(10);
        executor.setEntityClass(JobOffer.class);
        return executor;
    }
    
    @Bean
    @ServiceActivator(inputChannel="channel5")
    public JpaOutboundGateway save(JpaExecutor jpaExecutor, PlatformTransactionManager transactionManager) throws Exception {
    
        DefaultTransactionAttribute dta = new DefaultTransactionAttribute();
        dta.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
        dta.setReadOnly(false);
    
        MatchAlwaysTransactionAttributeSource matas = new MatchAlwaysTransactionAttributeSource();
        matas.setTransactionAttribute(dta);
    
        TransactionInterceptor ic = new TransactionInterceptor();
        ic.setTransactionManager(transactionManager);
        ic.setTransactionAttributeSource(matas);
    
        List<Advice> adviceChain = new ArrayList<>();
        adviceChain.add(ic);
    
        JpaOutboundGateway gateway = new JpaOutboundGateway(jpaExecutor);
        gateway.setAdviceChain(adviceChain);
        gateway.setProducesReply(false);
    
        return gateway;
    }