2017-07-04 62 views
1

我試圖使用休息服務並接收一個json,並將其轉換爲對象列表。但我收到了下面的錯誤。我是EIP的新手,在java dsl中沒有太多的教程。我配置了2個通道,一個用於發送請求,另一個用於接收有效負載。Spring集成HTTP出站網關使用Java DSL的發佈請求

Exception in thread "main" org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'httpPostAtms' is expected to be of type 'org.springframework.messaging.MessageChannel' but was actually of type 'org.springframework.integration.dsl.StandardIntegrationFlow' 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:378) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) 
at org.springframework.integration.support.channel.BeanFactoryChannelResolver.resolveDestination(BeanFactoryChannelResolver.java:89) 
at org.springframework.integration.support.channel.BeanFactoryChannelResolver.resolveDestination(BeanFactoryChannelResolver.java:46) 
at org.springframework.integration.gateway.MessagingGatewaySupport.getRequestChannel(MessagingGatewaySupport.java:344) 
at org.springframework.integration.gateway.MessagingGatewaySupport.doSendAndReceive(MessagingGatewaySupport.java:433) 
at org.springframework.integration.gateway.MessagingGatewaySupport.sendAndReceive(MessagingGatewaySupport.java:422) 
at org.springframework.integration.gateway.GatewayProxyFactoryBean.invokeGatewayMethod(GatewayProxyFactoryBean.java:474) 
at org.springframework.integration.gateway.GatewayProxyFactoryBean.doInvoke(GatewayProxyFactoryBean.java:429) 
at org.springframework.integration.gateway.GatewayProxyFactoryBean.invoke(GatewayProxyFactoryBean.java:420) 
at org.springframework.integration.gateway.GatewayCompletableFutureProxyFactoryBean.invoke(GatewayCompletableFutureProxyFactoryBean.java:65) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) 
at com.sun.proxy.$Proxy70.getAllAtms(Unknown Source) 
at com.backbase.atm.IngAtmApplication.main(IngAtmApplication.java:25) 

我使用SI與Spring引導

@IntegrationComponentScan 
@Configuration 
@EnableIntegration 
@ComponentScan 
public class InfrastructorConfig { 

    @Bean 
    public PollableChannel requestChannel() { 
     return new PriorityChannel() ; 
    } 

    @Bean 
    public MessageChannel replyChannel() { 
     return new DirectChannel() ; 
    } 

    @Bean(name = PollerMetadata.DEFAULT_POLLER) 
    public PollerMetadata poller() { 
     return Pollers.fixedRate(500).get(); 
    } 

    @Bean 
    public IntegrationFlow httpPostAtms() { 

     return IntegrationFlows.from("requestChannel") 
       .handle(Http.outboundGateway("https://www.ing.nl/api/locator/atms/") 
         .httpMethod(HttpMethod.POST) 
         .extractPayload(true)) 
       .<String, String>transform(p -> p.substring(5)) 
       .transform(Transformers.fromJson(Atm[].class)) 
       .channel("responseChannel") 
       .get(); 

     } 

    } 

網關

package com.backbase.atm.service; 

import java.util.List; 

import org.springframework.integration.annotation.Gateway; 
import org.springframework.integration.annotation.MessagingGateway; 
import org.springframework.messaging.handler.annotation.Payload; 

import com.backbase.atm.model.Atm; 

@MessagingGateway 
public interface IntegrationService { 

    @Gateway(requestChannel = "httpPostAtms") 
    @Payload("new java.util.Date()") 
    List<Atm> getAllAtms(); 
} 

應用程序啓動

package com.backbase.atm; 

import java.util.ArrayList; 
import java.util.List; 

import org.springframework.boot.CommandLineRunner; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.context.ConfigurableApplicationContext; 
import org.springframework.context.annotation.Bean; 
import com.backbase.atm.service.IntegrationService; 


@SpringBootApplication 
public class IngAtmApplication { 


    public static void main(String[] args) { 
     ConfigurableApplicationContext ctx = SpringApplication.run(IngAtmApplication.class, args); 
     ctx.getBean(IntegrationService.class).getAllAtms(); 
     ctx.close(); 
    } 

回答

1

你必須在網關d使用requestChannel bean的名稱efinition。現在你有一個IntegrationFlow bean的名字,但這是錯誤的。

請務必記住Spring集成中的所有內容都通過通道連接。

+0

這工作!當試圖在刪除前幾個字符後將json響應轉換爲對象時,我收到了一個錯誤:「線程中的異常」main「java.lang.ClassCastException:org.springframework.http.ResponseEntity無法轉換爲java.lang。字符串 \t at com.backbase.atm.config.InfrastructorConfig $$ Lambda $ 7/64989209.transform(Unknown Source)'我的假設是我將以'p'作爲字符串接收有效負載。或者類型推斷是否應該是別的? – androgirl

+0

使用'expectedResponseType(String.class)'不要返回完成的所有'ResponseEntity' –

+0

。謝謝!!! – androgirl

相關問題