jackson.databind 没有这样的方法错误

Posted

技术标签:

【中文标题】jackson.databind 没有这样的方法错误【英文标题】:jackson.databind no such method errors 【发布时间】:2017-10-02 16:57:10 【问题描述】:

我正在使用auth0-java 客户端库与auth0 v2 服务进行交互,我的代码在我的开发环境中编译并运行良好,但是当我在另一个测试环境中部署该构建时,它会引发以下异常:

java.lang.NoSuchMethodError:com.fasterxml.jackson.databind.ObjectMapper.readerFor(Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/ObjectReader;
    at com.auth0.json.mgmt.users.UsersPageDeserializer.getArrayElements(UsersPageDeserializer.java:52)
    at com.auth0.json.mgmt.users.UsersPageDeserializer.deserialize(UsersPageDeserializer.java:30)
    at com.auth0.json.mgmt.users.UsersPageDeserializer.deserialize(UsersPageDeserializer.java:15)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3562)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2597)
    at com.auth0.net.CustomRequest.parseResponse(CustomRequest.java:63)
    at com.auth0.net.BaseRequest.execute(BaseRequest.java:37)
    at com.myapp.security.Auth0Service.getUserByEmail(Auth0Service.java:246)
    at com.myapp.security.Auth0Service.checkForExsistingAuth0Account(Auth0Service.java:266)
    at com.myapp.security.AdminUILayout.lambda$launchProgressUpdater$0(AdminUILayout.java:293)
at java.lang.Thread.run(Thread.java:745)

我已经解决了几个 stackover flow 问题,例如 this 并尝试清理该测试环境的 .m2/repository/com/fasterxml 文件夹,但 cloudn't 解决 no such method 错误 这是我的pom文件,相关代码如下:

代码

public User getUserByEmail(String email)
        UserFilter filter = new UserFilter();
        filter.withQuery(email);
        Request<UsersPage> request = mgmt.users().list(filter);
        try 
            UsersPage response = request.execute();
            for (User u:response.getItems()) 
                if (u.getEmail().equals(email)) 
                    return u;
                
            
         catch (APIException exception) 
            // api error
            System.out.println("APIException:::::"+exception.getDescription());
         catch (Auth0Exception exception) 
            // request error
             System.out.println("Auth0Exception:::::"+exception.getMessage());
        catch(Exception ex)
            System.out.println("Other exception:::::"+ex.getMessage());
        
        return null;
    

pom.xml

<properties>
    <jackson.version>2.8.5</jackson.version>
  </properties>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-yaml</artifactId>
            <version>$jackson.version</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>$jackson.version</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>$jackson.version</version>
        </dependency>
     <dependency>
        <groupId>com.auth0</groupId>
        <artifactId>auth0</artifactId>
        <version>1.0.0</version>
    </dependency>

更新 我已将这些 jackson 依赖项移至我的 pom.xml 文件的 &lt;dependencyManagement&gt; 部分,

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>2.8.5</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.8.5</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>2.8.0</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

根据maven documentation,无论依赖项请求哪个版本的库jackson-core,都将始终使用版本$jackson.version,我的代码仍然在本地工作,但在那个测试服务器中 异常保持不变,即使我在该测试服务器代码中部署我的 war 文件也会引发相同的异常。

【问题讨论】:

你使用的是什么测试服务器和版本? 这是我的测试服务器配置:Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-47-generic x86_64),Glassfish 4.1.1 和 openjdk 9 嗯,我大部分时间都在使用 WildFly。但是我可以找到很多关于jackson和glassfish 4问题的文章blog.mikeski.net/blog_post/449 @MartijnBurger 是的,我们也从 glassfish 转移并计划从现在开始使用Payara,该测试服务器也将更新,如果问题在使用 Payara 后解决,我将更新此问题 【参考方案1】:

很可能您已经针对不同版本的类编译了代码,而不是您在运行它时使用的版本。

请确保在您运行代码的环境中,您的类路径上没有任何其他版本的 jackson-databind 依赖项。

【讨论】:

感谢您的建议,我正在检查整个依赖关系图以排除任何其他旧版本 我认为在 pom 依赖图中你不会有任何问题,因为如果 mvn clean install 的执行在 maven 编译阶段成功,那么这意味着即使存在传递依赖,依赖解析也选择了存在所需方法的正确版本,并将该版本放入构建的工件中。我认为问题出在您尝试运行构建工件的环境中,可能在类路径中还有同一个 jar 的另一个版本。【参考方案2】:

终于解决了这个问题,我发现glassfish 4.1.1有一个非常旧的2.3.2版本jackson-corejackson-annotationjackson-databind,所以我们决定使用Payara服务器,它使用了相当最新版本的jackson jackson 2.8.5 并测试了 no such method 错误已解决,代码在 Payara 服务器中运行良好

更新: glassfish 版本 5.0 使用更新版本 jackson 2.8.9 ,我认为使用它也可以解决这个问题

【讨论】:

@thanhdung0312 使用glassfish 版本5.0 ,使用更新版本jackson 2.8.9 ,我认为更新glassfish 将解决您的问题github.com/javaee/glassfish/releases/tag/5.0-b23【参考方案3】:

您的其他工件之一可能取决于不同版本的数据绑定。您可以尝试从每个人中明确排除它来猜测

<dependency>
  ...
  <exclusions>
    <exclusion>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
    </exclusion>
  </exclusions> 
</dependency>

【讨论】:

【参考方案4】:

请检查版本。

截图:

【讨论】:

【参考方案5】:

对我来说,由于jackson-databind的版本较低,我遇到了同样的异常:

发件人:

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

改为:

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

我只是用更高版本的 jackson-databind 更新我的 pom.xml 文件。 然后right-click Project--&gt;Update Maven Project,异常就解决了。

【讨论】:

【参考方案6】:
<!-- faster JSON -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.12.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.12.0</version>
        </dependency>

【讨论】:

问题已经解决,我们找到了问题背后的原因***.com/a/44201736/1298308,无论如何欢迎使用***

以上是关于jackson.databind 没有这样的方法错误的主要内容,如果未能解决你的问题,请参考以下文章

Jackson@JsonCreator 注解

ClassNotFoundException: com.fasterxml.jackson.databind.AnnotationIntrospector$XmlExtensions的解决方法

ClassNotFoundException: com.fasterxml.jackson.databind.AnnotationIntrospector$XmlExtensions的解决方法

ClassNotFoundException: com.fasterxml.jackson.databind.AnnotationIntrospector$XmlExtensions的解决方法

日常Exception第二十八回:com.fasterxml.jackson.databind.JsonMappingException: Conflicting setter definitio

日常Exception第二十八回:com.fasterxml.jackson.databind.JsonMappingException: Conflicting setter definitio