RestEasyClient IncompatibleClassChangeError (ResteasyProviderFactory.getContextData(java.lang.Class)

Posted

技术标签:

【中文标题】RestEasyClient IncompatibleClassChangeError (ResteasyProviderFactory.getContextData(java.lang.Class))【英文标题】: 【发布时间】:2021-06-16 10:54:40 【问题描述】:

当使用org.jboss.resteasy:resteasy-client:4.5.9.Final 时,我遇到了这个异常:Caused by: java.lang.IncompatibleClassChangeError: Expected static method 'java.lang.Object org.jboss.resteasy.spi.ResteasyProviderFactory.getContextData(java.lang.Class)'

但是,当我使用早期版本时,它似乎可以正常工作。 (或者至少它可以很好地欺骗我。)

这是我的简化 pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example</groupId>
  <artifactId>example-project</artifactId>
  <version>1.0-SNAPSHOT</version>
  <properties>
    <maven.compiler.source>15</maven.compiler.source>
    <maven.compiler.target>15</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <keycloak.version>12.0.4</keycloak.version>
    <!-- Seems to work with this version, but not 4.5.9.Final -->
    <resteasy.version>3.6.2.Final</resteasy.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.keycloak</groupId>
      <artifactId>keycloak-admin-client</artifactId>
      <version>$keycloak.version</version>
    </dependency>
    <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-client</artifactId>
      <version>$resteasy.version</version>
    </dependency>
    <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-jackson2-provider</artifactId>
      <version>$resteasy.version</version>
    </dependency>
    <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-multipart-provider</artifactId>
      <version>$resteasy.version</version>
    </dependency>
  </dependencies>
</project>

这是我的代码:

package org.example.keycloak;

import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.keycloak.OAuth2Constants;
import org.keycloak.admin.client.Keycloak;
import org.keycloak.admin.client.KeycloakBuilder;

public class KeycloakClientAuthExample 
    public static void main(String[] args) 
        Keycloak keycloak = KeycloakBuilder.builder()
                .serverUrl("http://localhost:8080/auth")
                .grantType(OAuth2Constants.PASSWORD)
                .realm("DungeoneersDemo")
                .clientId("dungeoneers-data")
                .clientSecret("11111111-2222-3333-4444-555555555555")
                .username("user")
                .password("pass")
                .resteasyClient(
                     // new ResteasyClientBuilderImpl() // <-- For 4.5.9.Final 
                        new ResteasyClientBuilder()
                                .connectionPoolSize(10).build()
                ).build();

        keycloak.tokenManager().getAccessToken();

        AccessTokenResponse atr =
                keycloak.tokenManager().getAccessToken();
        System.out.println(atr.getToken());
    

似乎有效,我得到了对我来说足够像不记名令牌的东西:eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI2bWhhWUQ..etc...

但是,当我将 resteasy.version 更新到更高版本✳ (4.5.9.Final) 时,我收到错误消息:

Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: RESTEASY003940: Unable to instantiate MessageBodyReader
    at org.jboss.resteasy.plugins.providers.RegisterBuiltin.register(RegisterBuiltin.java:78)
    at org.jboss.resteasy.plugins.providers.RegisterBuiltin.getClientInitializedResteasyProviderFactory(RegisterBuiltin.java:54)
    at org.jboss.resteasy.client.jaxrs.internal.ResteasyClientBuilderImpl.getProviderFactory(ResteasyClientBuilderImpl.java:372)
    at org.jboss.resteasy.client.jaxrs.internal.ResteasyClientBuilderImpl.build(ResteasyClientBuilderImpl.java:390)
    at org.sandbox.security.openidc.keycloak.KeycloakClientAuthExample.main(KeycloakClientAuthExample.java:22)
Caused by: java.lang.RuntimeException: RESTEASY003940: Unable to instantiate MessageBodyReader
    at org.jboss.resteasy.core.providerfactory.CommonProviders.processProviderContracts(CommonProviders.java:93)
    at org.jboss.resteasy.core.providerfactory.ClientHelper.processProviderContracts(ClientHelper.java:104)
    at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.processProviderContracts(ResteasyProviderFactoryImpl.java:841)
    at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.registerProvider(ResteasyProviderFactoryImpl.java:829)
    at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.registerProvider(ResteasyProviderFactoryImpl.java:816)
    at org.jboss.resteasy.plugins.providers.RegisterBuiltin.registerProviders(RegisterBuiltin.java:109)
    at org.jboss.resteasy.plugins.providers.RegisterBuiltin.register(RegisterBuiltin.java:74)
    ... 4 more
Caused by: java.lang.RuntimeException: RESTEASY003325: Failed to construct public org.jboss.resteasy.plugins.providers.jaxb.JAXBElementProvider()
    at org.jboss.resteasy.core.ConstructorInjectorImpl.constructOutsideRequest(ConstructorInjectorImpl.java:250)
    at org.jboss.resteasy.core.ConstructorInjectorImpl.construct(ConstructorInjectorImpl.java:209)
    at org.jboss.resteasy.core.providerfactory.Utils.createProviderInstance(Utils.java:102)
    at org.jboss.resteasy.core.providerfactory.CommonProviders.processProviderContracts(CommonProviders.java:87)
    ... 10 more
Caused by: java.lang.IncompatibleClassChangeError: Expected static method 'java.lang.Object org.jboss.resteasy.spi.ResteasyProviderFactory.getContextData(java.lang.Class)'
    at org.jboss.resteasy.plugins.providers.jaxb.AbstractJAXBProvider.<init>(AbstractJAXBProvider.java:52)
    at org.jboss.resteasy.plugins.providers.jaxb.JAXBElementProvider.<init>(JAXBElementProvider.java:46)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:64)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
    at org.jboss.resteasy.core.ConstructorInjectorImpl.constructOutsideRequest(ConstructorInjectorImpl.java:225)
    ... 13 more

Process finished with exit code 1

✳ 注意:升级到更高版本时,ResteasyClientBuilder被抽象出来,构造函数调用需要替换为new ResteasyClientBuilderImpl()

【问题讨论】:

【参考方案1】:

我正在输入我的问题,并且在提交前最后一次查看时,我发现了问题并想我会把它扔在那里以防万一其他人有这个问题。

事实证明,还有一个 resteasy 依赖项需要被拉入,否则会拉入一个旧版本。当使用resteasy-client 的较新版本时,另一个被拉入的依赖项是org.jboss.resteasy:resteasy-jaxb-provider:3.9.1.Final。我将新版本添加到我的 pom (org.jboss.resteasy:resteasy-jaxb-provider:4.5.9.Final) 中,现在一切似乎都正常了。

不知道为什么会这样。我想如果 resteasy-client 无论如何都拉入了依赖项,它应该拉入相同的版本。

【讨论】:

以上是关于RestEasyClient IncompatibleClassChangeError (ResteasyProviderFactory.getContextData(java.lang.Class)的主要内容,如果未能解决你的问题,请参考以下文章

使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATIBLE解决的方法

使用Genymotion安装APK出现错误INSTALL_FAILED_CPU_ABI_INCOMPATIBLE的解决办法

解决方案GenymotionEclipse模拟器启动报错INSTALL_FAILED_CPU_ABI_INCOMPATIBLE

解决方案GenymotionEclipse模拟器启动报错INSTALL_FAILED_CPU_ABI_INCOMPATIBLE

Genymotion INSTALL_FAILED_CPU_ABI_INCOMPATIBLE

通过ADB安装apk到genymotion报[INSTALL_FAILED_CPU_ABI_INCOMPATIBLE]错误的解决方法