【问题标题】:Spring Integration Java DSL problems at startup with Http Outbound Gateway使用 Http 出站网关启动时的 Spring Integration Java DSL 问题
【发布时间】:2016-11-26 01:57:20
【问题描述】:

我是 Spring Integration 的新手,我正在尝试开发一个应用程序,它只是 (1) 轮询文件夹以查找扩展名为 .dat 的新文件,其中包含 csv 格式的数据 (2) 为每一行初始化一个域 POJO 对象RecordDTO 类,最后 (3) 将此对象作为有效负载发送到带有 POST 的 REST 服务。

为此,我尝试使用 Java DSL 进行 Spring 集成。

我遇到的问题是以下VerifyError / HttpRequestExecutingMessageHandler overrides final method onInit. 异常。

2016-07-22 10:01:38.965 ERROR 4460 --- [           main] o.s.boot.SpringApplication               : Application startup failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'upcase' defined in eu.softeco.examples.SpringBootIntegrationTestApplication: Initialization of bean failed; nest
ed exception is java.lang.VerifyError: class org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler overrides final method onInit.()V
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) ~[spring-beans-4.3.1.RELEASE.jar:4.3.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.3.1.RELEASE.jar:4.3.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.1.RELEASE.jar:4.3.1.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.1.RELEASE.jar:4.3.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.1.RELEASE.jar:4.3.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.1.RELEASE.jar:4.3.1.RELEASE]

...

Caused by: java.lang.VerifyError: class org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler overrides final method onInit.()V
    at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.8.0_45]
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760) ~[na:1.8.0_45]
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[na:1.8.0_45]

...

以下是有关我的代码和 maven 配置的相关详细信息。请不要这样

1) 问题出在启动时,在任何数据放入输入文件夹之前

2) 如果我用简单的(已注释的)System.out.println 替换最后的 Http outboundGateway 步骤,一切正常。

以下是代码/配置详细信息。这是带有 Spring Integration Flow 定义的主要 Spring Boot 应用程序类:

@SpringBootApplication
@EnableIntegration 
@IntegrationComponentScan
public class SpringBootIntegrationTestApplication {

        ...

    public static void main(String[] args) {
          SpringApplication.run(SpringBootIntegrationTestApplication.class, args);
    }

    /**
     * Inbound FileReadingMessageSource 
     */

    @Bean
    @InboundChannelAdapter(channel = "upcase.input", poller = @Poller(fixedDelay = "4000"))
    public MessageSource<File> fileReadingMessageSource() {
         FileReadingMessageSource source = new FileReadingMessageSource();
         source.setDirectory(new File(INBOUND_PATH));
         source.setFilter(new SimplePatternFileListFilter("*.dat"));
         return source;
    }


    /**
     * Spring Integration Java DSL Flow
         */

    @Bean
    public IntegrationFlow upcase() {

        FileToStringTransformer fileToStringTranformer = Transformers.fileToString();
        fileToStringTranformer.setDeleteFiles(true);

            return flow -> flow

                    // get string contents from fie 
                    .transform(fileToStringTranformer) 

                    // split into individual lines
                    .split( s -> s.applySequence(true).get().getT2().setDelimiters("\n"))

                    // cleanup lines from trailing returns
                    .transform( (String s) -> s.replace("\n", "").replace("\r", "") )

                    // convert csv string to RecordDTO object
                    .transform("@recordFromCsvTransformer.transform(payload)")

                    // print on System.out
                    // .handle(m -> System.out.println(m.getPayload()))

                    // send to 
                    .handle(Http.outboundGateway("http://localhost:8080/records")
                                .httpMethod(HttpMethod.POST)
                        .expectedResponseType(RecordDTO.class));


    }

}

低于RecordFromCsvTransformer

@Component
public class RecordFromCsvTransformer
{
    @Transformer
    public RecordDTO transform(String csvline) throws Exception {

        RecordDTO record = new RecordDTO();

        ... parse csv and initialize record's fields...

        return record;
    }

}

最后是pom.xml的相关部分(依赖);

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.0.RC1</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>

...

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-integration</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.integration</groupId>
        <artifactId>spring-integration-file</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.integration</groupId>
        <artifactId>spring-integration-http</artifactId>
        <version>2.1.0.RELEASE</version>
    </dependency>
    ...
</dependencies>

...

一般来说,作为一个附带问题,有人可以建议我一些好的教程/入门指南来学习 Spring 与 Java Annotation/Java DSL 的集成吗?到目前为止,我只找到了基于 Spring Integration XML 配置的介绍性指南或关于 Java Annotations/DSL 的材料,但这已经需要 Spring Integration 的先验知识。

【问题讨论】:

    标签: spring spring-boot spring-integration


    【解决方案1】:

    &lt;version&gt;2.1.0.RELEASE&lt;/version&gt;

    该版本的 Spring Integration 与 maven 传递引入的 spring-integration-core 版本不匹配。

    您需要使用所有 spring-integration-* 文件的相同版本 - 检查启动时正在拉入哪个版本的 spring-integration-file 并使用相同的版本。

    【讨论】:

      猜你喜欢
      • 2018-09-27
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      相关资源
      最近更新 更多