chrx
chrx

Reputation: 2518

Spring Integration Java DSL problems at startup with Http Outbound Gateway

I'm new to Spring Integration and am trying to develop an application which simply (1) polls a folder for new files with extension .dat containing data in csv format (2) initialize for each line a domain POJO object of class RecordDTO and finally (3) sends this object as payload to a REST service with a POST.

For this I'm trying to use Java DSL for Spring Integration.

The problem I'm getting is the following VerifyError / HttpRequestExecutingMessageHandler overrides final method onInit. exception.

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]

...

Below are relevant details concerning my code and maven configuration. Please not that

1) the problem is at startup, before any data is put in the input folder

2) if I replace the final Http outboundGateway step with the simple (commented) System.out.println, everything works fine.

Following are code/config details. This is my main Spring Boot application class with Spring Integration Flow definition:

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


    }

}

Below the RecordFromCsvTransformer class

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

}

And Finally the relevant parts of pom.xml (dependencies);

<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>

...

As a side question in general, can someone suggest me some good tutorial / getting started guide to learn Spring Integration with Java Annotation/Java DSL? So far I've only found either introductory guide based on Spring Integration XML configuration or material about Java Annotations/DSL but that already requires prior knowledge of Spring Integration.

Upvotes: 0

Views: 1452

Answers (1)

Gary Russell
Gary Russell

Reputation: 174749

<version>2.1.0.RELEASE</version>

That version of Spring Integration is mismatched with the spring-integration-core version brought in transitively by maven.

You need to use the same version of all spring-integration-* files - check which version of spring-integration-file is being pulled in by boot and use the same version.

Upvotes: 0

Related Questions