2016-05-14 59 views
1

我面臨的最新版本的駱駝和REST DSL路線的問題。完整的代碼可以從這裏找到並運行:https://github.com/mikevoxcap/nvisia-catalog-camel-service。我發現了一個例外,當我嘗試運行路線,下面根本原因:問題與駱駝和傑克遜依賴

Caused by: java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.introspect.AnnotatedMember.getType()Lcom/fasterxml/jackson/databind/JavaType; 
.... 
at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:926) 
    at org.apache.camel.component.jackson.JacksonDataFormat.marshal(JacksonDataFormat.java:154) 
    at org.apache.camel.processor.MarshalProcessor.process(MarshalProcessor.java:69) 

我的問題是,傑克遜的版本,我應該把目標定到不再接收此異常。

我帶下面的依賴關係:

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
    <spring.boot.version>1.3.5.RELEASE</spring.boot.version> 
    <camel.version>2.17.1</camel.version> 
    <java.version>1.8</java.version> 
</properties> 

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-dependencies</artifactId> 
      <version>${spring.boot.version}</version> 
      <type>pom</type> 
      <scope>import</scope> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-actuator</artifactId> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-spring-boot</artifactId> 
     <version>${camel.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-jackson</artifactId> 
     <version>${camel.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-servlet</artifactId> 
     <version>${camel.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-swagger-java</artifactId> 
     <version>${camel.version}</version> 
    </dependency> 

    <!-- Testing --> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-test</artifactId> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-test-spring</artifactId> 
     <version>${camel.version}</version> 
     <scope>test</scope> 
    </dependency> 
</dependencies> 

做我收到的例外在經過一番搜索,幾個人都遇到了這個問題,當涉及到版本衝突。我注意到camel-jackson庫引入了jackson-module-jaxb-annotations 2.7.2,但剩下的jackson庫在2.6.6。我試圖排除傑克遜模塊jaxb註釋2.7.2,然後直接包括2.6.6,但仍然導致異常。

我的路線是比較簡單的:

// Definition of the get catalog item endpoint 
    rest("/catalogItem"). 
     // This is a GET method call for getting a catalog item by ID. 
    get("{id}"). 
     // Description of what this method does 
     description("Retrieve a catalog item by ID"). 
     // Define the output type that will be returned from this method 
     outType(CatalogItem.class) 
     // Define where the message is routed to as a URI. Here we use a 
     // Spring Bean and define the bean method to invoke. Note that Camel 
     // has converted the ID placeholder from the URL into a header 
     // entry. 
     .to("bean:catalogService?method=getCatalogItem(${header.id})"); 

我對象被用作JSON類型也很簡單:

public class CatalogItem { 

    private int id; 
    private double price; 
    private String catalogItemType; 
    private List<CatalogItemAttribute> attributes; 

public class CatalogItemAttribute { 

    private String attributeName; 
    private String attributeValue; 
+0

此錯誤'造成的:java.lang.NoSuchMethodError'表明,要麼你使用了錯誤的方法名,或者你正在使用一個版本的依賴不再有實施此方法,或者尚未使用的是庫版本沒有實現。 –

+0

@JorgeCampos是的,這就是我的問題在這裏。當解決POM問題時,傑克遜註釋依賴是更高版本。我試圖確定是否應該排除傑克遜核心庫,並將版本提高到2.7.2,如果需要降級到低於2.6.6的版本。 –

+1

因此,我在jack-annotations,jackson-core和jackson-databind中添加了排除項到spring-boot-starter-web,spring-boot-starter-actuator,camel-jackson和camel-swagger-java依賴項。然後我用2.7.2專門定義了這三個庫的依賴關係,現在代碼可以工作。經過一番研究,這看起來比Boot更像Camel的問題。看起來像1.4的Boot更新到了Jackson的2.7,所以我現在只需要給出這個答案。 –

回答

4

雖然我還沒有發現任何來自官方的駱駝,它看起來一旦Spring Boot 1.4發佈,它將自動解決,因爲它將支持Jackson 2.7。與此同時,我更新了我的依賴關係,如下所述。我爲jackson-annotations,jackson-core和jackson-databind庫添加了排除項到spring-boot-starter-web,spring-boot-starter-actuator,camel-jackson和camel-swagger-java依賴項。然後我用2.7.2指定了三個傑克遜依賴關係。

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
     <exclusions> 
      <exclusion> 
       <artifactId>jackson-annotations</artifactId> 
       <groupId>com.fasterxml.jackson.core</groupId> 
      </exclusion> 
      <exclusion> 
       <artifactId>jackson-core</artifactId> 
       <groupId>com.fasterxml.jackson.core</groupId> 
      </exclusion> 
      <exclusion> 
       <artifactId>jackson-databind</artifactId> 
       <groupId>com.fasterxml.jackson.core</groupId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-actuator</artifactId> 
     <exclusions> 
      <exclusion> 
       <artifactId>jackson-databind</artifactId> 
       <groupId>com.fasterxml.jackson.core</groupId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-spring-boot</artifactId> 
     <version>${camel.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-jackson</artifactId> 
     <version>${camel.version}</version> 
     <exclusions> 
      <exclusion> 
       <artifactId>jackson-annotations</artifactId> 
       <groupId>com.fasterxml.jackson.core</groupId> 
      </exclusion> 
      <exclusion> 
       <artifactId>jackson-core</artifactId> 
       <groupId>com.fasterxml.jackson.core</groupId> 
      </exclusion> 
      <exclusion> 
       <artifactId>jackson-databind</artifactId> 
       <groupId>com.fasterxml.jackson.core</groupId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-servlet</artifactId> 
     <version>${camel.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-swagger-java</artifactId> 
     <version>${camel.version}</version> 
     <exclusions> 
      <exclusion> 
       <artifactId>jackson-annotations</artifactId> 
       <groupId>com.fasterxml.jackson.core</groupId> 
      </exclusion> 
      <exclusion> 
       <artifactId>jackson-core</artifactId> 
       <groupId>com.fasterxml.jackson.core</groupId> 
      </exclusion> 
      <exclusion> 
       <artifactId>jackson-databind</artifactId> 
       <groupId>com.fasterxml.jackson.core</groupId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

    <dependency> 
     <artifactId>jackson-annotations</artifactId> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <version>2.7.2</version> 
    </dependency> 
    <dependency> 
     <artifactId>jackson-core</artifactId> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <version>2.7.2</version> 
    </dependency> 
    <dependency> 
     <artifactId>jackson-databind</artifactId> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <version>2.7.2</version> 
    </dependency> 

    <!-- Testing --> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-test</artifactId> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-test-spring</artifactId> 
     <version>${camel.version}</version> 
     <scope>test</scope> 
    </dependency> 
</dependencies>