2016-07-22 36 views
0

我是新來的Spring Integration,我試圖開發一個應用程序Spring集成的Java DSL問題,這只是(1)輪詢與csv格式包含數據擴展.dat新文件的文件夾(2)初始化每行RecordDTO類的域POJO對象和最後(3)發送該對象作爲有效載荷爲與POST REST服務。在使用HTTP出站網關啓動

對於這個我試圖使用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)如果我更換最後的HTTP outboundGateway一步用簡單的(評論)的System.out.println之前,一切正常。

以下是代碼/配置的詳細信息。這是我的主要春季啓動應用程序類Spring集成流程定義:

@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註釋/ Java的DSL?到目前爲止,我只找到基於Spring集成XML配置的入門指南或有關Java Annotations/DSL的材料,但這已經需要Spring集成的先前知識。

回答

0

<version>2.1.0.RELEASE</version>

這Spring集成的版本不匹配與行家在傳遞性帶來的spring-integration-core版本。

您需要使用所有spring-integration- *文件的相同版本 - 檢查哪個版本的spring-integration-file正在通過引導進入並使用相同的版本。

+0

感謝,這解決了這個問題 – chrx