2016-07-22 12 views
0

Ich bin neu bei Spring Integration und versuche, eine Anwendung zu entwickeln, die einfach (1) einen Ordner für neue Dateien mit der Erweiterung .dat mit Daten im CSV-Format abfragt (2) initialisiert für jede Zeile ein POJO-Objekt der Domäne der Klasse RecordDTO und schließlich (3) sendet dieses Objekt als Payload an einen REST-Dienst mit einem POST.Spring Integration Java DSL Probleme beim Start mit Http Outbound Gateway

Dafür versuche ich Java DSL für Spring Integration zu verwenden. Das Problem, das ich bekomme, ist die folgende VerifyError/HttpRequestExecutingMessageHandler overrides final method onInit. Ausnahme.

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] 

... 

Im Folgenden finden Sie relevante Details zu meiner Code- und Maven-Konfiguration. Bitte nicht, dass

1) das Problem beim Start ist, bevor Daten in dem Eingangsordner gelegt werden

2), wenn ich den letzte Http outboundGateway Schritt mit dem einfachen (kommentiert) System.out.println ersetzen, Alles funktioniert gut.

Im Folgenden sind Code/Config-Details. Das ist mein Haupt Frühling Boot-Anwendungsklasse mit Feder Integration Ablaufdefinition:

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


    } 

} 

Unterhalb der RecordFromCsvTransformer Klasse

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

} 

und schließlich die relevanten Teile pom.xml (Abhängigkeiten);

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

... 

Als Seite Frage im Allgemeinen, kann jemand mir ein paar gute Tutorial vorschlagen/Erste Schritte Frühjahr Integration mit Java Annotation/Java DSL zu lernen? Bislang habe ich nur einen Einführungsleitfaden gefunden, der auf der XML-Konfiguration von Spring Integration oder Material über Java Annotations/DSL basiert, aber das erfordert bereits Vorkenntnisse von Spring Integration.

Antwort

0

<version>2.1.0.RELEASE</version>

Diese Version von Spring Integration mit der spring-integration-core Version nicht übereinstimmen ist in transitively von Maven gebracht.

Sie müssen die gleiche Version aller Spring-Integration- * Dateien verwenden - prüfen Sie, welche Version von spring-integration-file beim Hochfahren eingeht und verwenden Sie die gleiche Version.

+0

danke, das hat das Problem gelöst – chrx