【问题标题】:Jackson ObjectMapper() constructor throws NoSuchMethodJackson ObjectMapper() 构造函数抛出 NoSuchMethod
【发布时间】:2011-02-23 17:02:54
【问题描述】:

我正在使用 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)

不明白

【问题讨论】:

  • 在使用 hadoop 遇到此错误时,排除机制起作用。我还必须从 hadoop 核心依赖项中排除 jackson-core-asl。

标签: java json jackson nosuchmethoderror


【解决方案1】:

我猜您的 Jackson JAR 不同步。 JavaType 类在 jackson-core JAR 中,ObjectMapper 类在 jackson-mapper 中。

确保它们是相同的版本。

【讨论】:

  • 是的,这是一个不幸但常见的陷阱,很容易发生,尤其是在使用 Maven 时。
  • @StaxMan 同意,这是一个常见的陷阱,但毫无疑问,Maven 通过显式声明依赖版本来提供帮助。
  • @SeanConnolly 是的,我可能应该澄清一下;这是传递依赖关系的一个普遍问题,不是真正的 Maven,而是建模。
  • 好像没这么简单。 maven 中只有一个版本的 jackson-mapper。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      在我的情况下,这是由于 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>
      

      【讨论】:

        【解决方案5】:

        就我而言,是 amazonaws sdk 造成了这种情况。仅对 jackson-mapper-asl 使用排除项不起作用,但对 core 和 mapper 使用排除项则可以:

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

        【讨论】:

          【解决方案6】:

          在使用 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>
          

          【讨论】:

            【解决方案7】:

            这是因为 @RequestBody 对不同的 spring 版本使用不同的 jar: 如果使用 spring 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>
            

            如果使用spring 3必须使用这个jar:

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

            【讨论】:

            • 直到我开始使用注解@RequestBody (Spring v4.0.6),jackson-all-1.9.6.jar 一切正常。使用 jackson-all-1.9.6.jar 和 Spring v3.x 可以正常工作。
            【解决方案8】:

            是的,任何遇到这个问题的人,他都应该明确地调查依赖关系

            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>
            

            我花了几个小时才找到这个问题,感谢大家为上述解决方案提供了启发!继续努力!

            【讨论】:

              【解决方案9】:

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

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

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

              就我而言,问题是我有几个版本的库提供了这个类:
              • org.codehaus.jackson:jackson-mapper-lgpl:jar:1.5.0
              • org.codehaus.jackson:jackson-core-lgpl:jar:1.5.0
              • org.codehaus.jackson:jackson-mapper-asl:jar:1.8.2
              • org.codehaus.jackson:jackson-core-asl:jar: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 版本

              【讨论】:

                猜你喜欢
                • 2019-01-28
                • 1970-01-01
                • 2011-06-02
                • 1970-01-01
                • 1970-01-01
                • 2016-08-13
                • 2011-04-07
                • 2014-08-10
                • 2011-11-04
                相关资源
                最近更新 更多