Jackson ObjectMapper()构造函数抛出NoSuchMethod

时间:2011-02-23 17:02:54

标签: java json jackson nosuchmethoderror

我正在使用Jackson示例代码反序列化POJO:

ObjectMapper m = new ObjectMapper();

此行抛出NoSuchMethodError:

Exception in thread "main" java.lang.NoSuchMethodError: org.codehaus.jackson.type.JavaType.<init>(Ljava/lang/Class;)V
    at org.codehaus.jackson.map.type.TypeBase.<init>(TypeBase.java:15)
    at org.codehaus.jackson.map.type.SimpleType.<init>(SimpleType.java:45)
    at org.codehaus.jackson.map.type.SimpleType.<init>(SimpleType.java:40)
    at org.codehaus.jackson.map.type.TypeBindings.<clinit>(TypeBindings.java:18)
    at org.codehaus.jackson.map.type.TypeFactory._fromType(TypeFactory.java:525)
    at org.codehaus.jackson.map.type.TypeFactory.type(TypeFactory.java:61)
    at org.codehaus.jackson.map.ObjectMapper.<clinit>(ObjectMapper.java:179)
    at com.me.util.ctrl.BillingJobStatus.fromJson(BillingJobStatus.java:37)

我不明白

9 个答案:

答案 0 :(得分:28)

我猜你的杰克逊JAR不同步。 JavaType类位于jackson-core JAR中,ObjectMapper类位于jackson-mapper

确保它们都是相同的版本。

答案 1 :(得分:5)

我有同样的问题。核心jar是1.7.1,而映射器是1.8.1。注意:为了解决这个问题,我添加了一个排除项并下拉了正确的版本。

        <exclusions>
            <exclusion>
                <groupId>org.codehaus.jackson</groupId>
                <artifactId>jackson-mapper-asl</artifactId>
            </exclusion>
        </exclusions>

答案 2 :(得分:5)

这里的技巧是将jackson从使用它的依赖项中排除。

要检查哪些依赖项导入它,您可以使用以下maven命令:

mvn dependency:tree -Dincludes=org.codehaus.jackson

答案 3 :(得分:3)

在我的情况下,这是由于yammer-metrics库包括旧版的jackson。

<dependency>
  <groupId>com.yammer.metrics</groupId>
  <artifactId>metrics-servlet</artifactId>
  <version>2.1.2</version>
    <exclusions>
        <exclusion>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
        </exclusion>
    </exclusions>
</dependency>

答案 4 :(得分:3)

在我的情况下,amazonaws sdk引起​​了这种情况。仅使用jackson-mapper-asl的排除不起作用,但使用核心和映射器的排除做了:

    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk</artifactId>
        <version>1.3.13</version>
        <exclusions>
            <exclusion>
                <groupId>org.codehaus.jackson</groupId>
                <artifactId>jackson-core-asl</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.codehaus.jackson</groupId>
                <artifactId>jackson-mapper-asl</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

答案 5 :(得分:2)

在处理Hadoop时,我通过设置以下排除项来消除此错误

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-core</artifactId>
    <version>1.0.1</version>
    <exclusions>
        <exclusion>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
        </exclusion>
    </exclusions>   
</dependency>

答案 6 :(得分:1)

@RequestBody是因为不同的弹簧版本使用不同的jar: 如果使用弹簧4而不是添加不同的罐子:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.4.3</version>
</dependency>

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

如果使用弹簧3必须使用这个罐子:

 <dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.5.0</version>
</dependency>

答案 7 :(得分:0)

是的,任何遇到此问题的人,都应该使用

来定义调查依赖关系
mvn dependency:tree -Dincludes=org.codehaus.jackson

在我的情况下,我有一个杰克逊依赖于Atmosphere-Socket-io:

<dependency>
        <groupId>org.atmosphere</groupId>
        <artifactId>atmosphere-socketio</artifactId>
        <version>2.2.1</version>
        <exclusions>
            <exclusion>
                <groupId>org.codehaus.jackson</groupId>
                <artifactId>jackson-mapper-lgpl</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.codehaus.jackson</groupId>
                <artifactId>jackson-core-lgpl</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

我花了几个小时跟踪它,感谢所有人为上述解决方案带来的灵感!保持良好的工作!

答案 8 :(得分:0)

将WebApp从Tomcat 6迁移到Tomcat 8时,我遇到了这个问题。 在Tomcat6和Tomcat7上,我的WebApp会很好地启动,但在Tomcat8上我会得到这个异常(似乎T6和T7按字母顺序加载类,但是T8不会 - https://stackoverflow.com/a/26642798/1864614)。

问题是我有2个版本的课程

org.codehaus.jackson.map.ObjectMapper
正如@wild_nothing所回答的那样,我检查了树的依赖关系,列出了对 org.codehaus.jackson 的所有依赖关系

就我而言,问题是我有几个版本的库提供了这个类:

  • org.codehaus.jackson:杰克逊 - 映射器-LGPL:罐:1.5.0
  • org.codehaus.jackson:杰克逊 - 芯 - LGPL:罐:1.5.0
  • org.codehaus.jackson:jackson-mapper-asl:jar:1.8.2
  • org.codehaus.jackson:杰克逊 - 芯-ASL:罐:1.8.2

我的解决方案是排除旧版本(1.5.0)并仅保留1.8.2版本

<dependency>
        <groupId>cfm.foo</groupId>
        <artifactId>jive</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.codehaus.jackson</groupId>
                <artifactId>jackson-core-lgpl</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.codehaus.jackson</groupId>
                <artifactId>jackson-mapper-lgpl</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
  • 在这种情况下 jive 取决于较旧的1.5.0版本