Spring Integration HTTP Outbound Gateway Post Request с Java DSL

Я пытаюсь использовать службу отдыха, получить обратно json и преобразовать его в список объектов. но я получаю следующий erorr. Я новичок в EIP, и в java dsl не так много руководств по этому поводу. Я настроил 2 канала, один для отправки запроса и один для получения обратно полезной нагрузки.

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 Boot

@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();
    }

person androgirl    schedule 04.07.2017    source источник


Ответы (1)


Вы должны использовать requestChannel имя bean-компонента в определении шлюза. Прямо сейчас у вас есть IntegrationFlow имя bean-компонента, но это неверно.

Всегда помните, что все в Spring Integration связано через каналы.

person Artem Bilan    schedule 04.07.2017
comment
Это работает!!! при попытке преобразовать ответ json в объект после удаления первых нескольких символов я получаю сообщение об ошибке Exception in thread "main" java.lang.ClassCastException: org.springframework.http.ResponseEntity cannot be cast to java.lang.String at com.backbase.atm.config.InfrastructorConfig$$Lambda$7/64989209.transform(Unknown Source) я предполагал, что я получу полезную нагрузку в виде строки с 'p'. или вывод типа должен быть чем-то другим? - person androgirl; 04.07.2017
comment
Используйте expectedResponseType(String.class), чтобы не возвращать все ResponseEntity - person Artem Bilan; 05.07.2017
comment
еще кое-что @Artem. Из этой статьи: ссылка В нем указано имя входной канал разрешается как beanName + .input. вот почему я сначала использовал имя bean-компонента IntegrationFlow. Статья ошибочна или они относятся к другому сценарию? - person androgirl; 09.07.2017
comment
Ok! Но почему вы все равно не используете этот суффикс .input? С другой стороны, вы все равно не можете этого сделать, потому что у вас есть шаблон .from(). Подробнее см. Здесь: github. com / spring-projects / spring-integration-java-dsl / wiki / - person Artem Bilan; 09.07.2017