简体   繁体   English

RESTEASY003145:找不到内容类型 application/json 和类型类 org.keycloak.representations.AccessTokenResponse 的 MessageBodyReader

[英]RESTEASY003145: Unable to find a MessageBodyReader of content-type application/json and type class org.keycloak.representations.AccessTokenResponse

I'm trying to test Keycloak REST API.我正在尝试测试 Keycloak REST API。 Instaled the version 2.1.0.Final.安装了 2.1.0.Final 版本。 I can access the admin through browser with SSL without problems.我可以毫无问题地通过带有 SSL 的浏览器访问管理员。

I'm using the code above:我正在使用上面的代码:

Keycloak keycloakClient = KeycloakBuilder.builder()
.serverUrl("https://keycloak.intra.rps.com.br/auth")
.realm("testrealm")
.username("development")
.password("development")
.clientId("admin-cli")
.resteasyClient(new ResteasyClientBuilder().connectionPoolSize(10).build())
.build();
List<RealmRepresentation> rr = keycloakClient.realms().findAll();

And got the error:并得到错误:

javax.ws.rs.ProcessingException: RESTEASY003145: Unable to find a MessageBodyReader of content-type application/json and type class org.keycloak.representations.AccessTokenResponse

javax.ws.rs.client.ResponseProcessingException: javax.ws.rs.ProcessingException: RESTEASY003145: Unable to find a MessageBodyReader of content-type application/json and type class org.keycloak.representations.AccessTokenResponse
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.extractResult(ClientInvocation.java:141)
at org.jboss.resteasy.client.jaxrs.internal.proxy.extractors.BodyEntityExtractor.extractEntity(BodyEntityExtractor.java:60)
at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientInvoker.invoke(ClientInvoker.java:104)
at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientProxy.invoke(ClientProxy.java:76)
at com.sun.proxy.$Proxy20.grantToken(Unknown Source)
at org.keycloak.admin.client.token.TokenManager.grantToken(TokenManager.java:85)
at org.keycloak.admin.client.token.TokenManager.getAccessToken(TokenManager.java:65)
at org.keycloak.admin.client.token.TokenManager.getAccessTokenString(TokenManager.java:60)
at org.keycloak.admin.client.resource.BearerAuthFilter.filter(BearerAuthFilter.java:52)
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.invoke(ClientInvocation.java:413)
at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientInvoker.invoke(ClientInvoker.java:102)
at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientProxy.invoke(ClientProxy.java:76)
at com.sun.proxy.$Proxy22.findAll(Unknown Source)
at br.com.rps.itsm.sd.SgpKeycloakClient.doGet(SgpKeycloakClient.java:71)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:284)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:263)
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:174)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:793)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: javax.ws.rs.ProcessingException: RESTEASY003145: Unable to find a MessageBodyReader of content-type application/json and type class org.keycloak.representations.AccessTokenResponse
at org.jboss.resteasy.core.interception.ClientReaderInterceptorContext.throwReaderNotFound(ClientReaderInterceptorContext.java:42)
at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.getReader(AbstractReaderInterceptorContext.java:75)
at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.proceed(AbstractReaderInterceptorContext.java:52)
at org.jboss.resteasy.plugins.interceptors.encoding.GZIPDecodingInterceptor.aroundReadFrom(GZIPDecodingInterceptor.java:59)
at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.proceed(AbstractReaderInterceptorContext.java:55)
at org.jboss.resteasy.client.jaxrs.internal.ClientResponse.readFrom(ClientResponse.java:251)
at org.jboss.resteasy.client.jaxrs.internal.ClientResponse.readEntity(ClientResponse.java:181)
at org.jboss.resteasy.specimpl.BuiltResponse.readEntity(BuiltResponse.java:213)
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.extractResult(ClientInvocation.java:105)

I added the dependencies above, but do not solve my problem:我添加了上面的依赖项,但没有解决我的问题:

    <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-client</artifactId>
            <version>3.0.19.Final</version>
    </dependency>
    <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jackson-provider</artifactId>
            <version>3.0.19.Final</version>
    </dependency>

Any clues?有什么线索吗?

I used the dependency to fix this issue我使用依赖项来解决这个问题

   <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jackson2-provider</artifactId>
        <version>3.1.0.Final</version>
    </dependency>

I solved !!我解决了!! You must add org.jboss.resteasy.plugins.providers.jackson.ResteasyJacksonProvider into META-INF/services/javax.ws.rs.ext.Providers file then run your executable jar.您必须将 org.jboss.resteasy.plugins.providers.jackson.ResteasyJacksonProvider 添加到 META-INF/services/javax.ws.rs.ext.Providers 文件中,然后运行您的可执行 jar。

Or if you create client with proxy then better to initialize provider factory before:或者,如果您使用代理创建客户端,那么最好在之前初始化提供程序工厂:

    ResteasyProviderFactory instance=ResteasyProviderFactory.getInstance();
    RegisterBuiltin.register(instance);
    instance.registerProvider(ResteasyJackson2Provider.class);

Adding what Dmitry pointed out here for me causes the following warning:添加Dmitry 在这里为我指出的内容会导致以下警告:

WARN: RESTEASY002155: Provider class org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider is already registered.  2nd registration is being ignored.

Probably as Bacon said the provider is automatically registered by simply adding the dependency:可能正如培根所说,只需添加依赖项即可自动注册提供程序:

    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jackson2-provider</artifactId>
        <version>${resteasy.version}</version>
    </dependency>

I had the problem, that MatteoM pointed out.我遇到了问题, MatteoM指出。 I solved with maven-shade-plugin and the transformes tag.我用 maven-shade-plugin 和 transforms 标签解决了。 Maybe it helps someone.也许它可以帮助某人。

 <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.0</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <filters>
                            <filter>
                                <artifact>*:*</artifact>
                                <excludes>
                                    <exclude>META-INF/*.SF</exclude>
                                    <exclude>META-INF/*.DSA</exclude>
                                    <exclude>META-INF/*.RSA</exclude>
                                </excludes>
                            </filter>
                        </filters>
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <manifestEntries>
                                    <Main-Class>de.example.MainClass</Main-Class>
                                    <X-Compile-Source-JDK>1.8</X-Compile-Source-JDK>
                                    <X-Compile-Target-JDK>1.8</X-Compile-Target-JDK>
                                </manifestEntries>
                            </transformer>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/services/javax.ws.rs.ext.Providers</resource>
                            </transformer>
                        </transformers>
                        <artifactSet/>
                        <outputFile>${project.build.directory}/${project.artifactId}-${project.version}-fat.jar</outputFile>
                    </configuration>
                </execution>
            </executions>
        </plugin>

On a wildfly 11 / Keycloak context, the following made it work with the RestEasyClientBuilder .在 wildfly 11 / Keycloak 上下文中,以下使其与RestEasyClientBuilder一起使用。

ResteasyClientBuilder builder = new ResteasyClientBuilder();
ResteasyProviderFactory providerFactory = ResteasyProviderFactory.getInstance();
builder.providerFactory(providerFactory);

Double check if ResteasyProviderFactory defaults to true with your Resteasy version.仔细检查ResteasyProviderFactory是否在您的 Resteasy 版本中默认为true If not, set the builtIns manually:如果没有,请手动设置内置函数:

ResteasyProviderFactory.setRegisterBuiltinByDefault(true);
// or if ResteasyProviderFactory was already instantiated
RegisterBuiltin.register(providerFactory);

In my case, I traced the root issue to the fact that I switched to CompletableFuture .就我而言,我将根本问题追溯到我切换到CompletableFuture的事实。

The version of the client used is probably outdated or something and while it works from eclipse, from an external executable it crashes with this error.使用的客户端版本可能已过时或其他什么,当它在 eclipse 中运行时,从外部可执行文件中它会因此错误而崩溃。

I'll probably post a fix, but it's going to either be: update the library or stop using the CompletableFuture on this library.我可能会发布一个修复程序,但可能是:更新库或停止在此库上使用 CompletableFuture。

Have you registered an instance of @Provider when creating the target/client?您在创建目标/客户端时是否注册了@Provider的实例? I see you haven't.我看你没有。

In my case, I was moving from Resteasy 3 to Resteasy 4, and receiving content type text/plain .就我而言,我正在从 Resteasy 3 迁移到 Resteasy 4,并接收内容类型text/plain In Resteasy-jaxrs 3, I used ResteasyJackson2Provider and it implements MessageBodyReader and MessageBodyWriter , and it worked.在 Resteasy-jaxrs 3 中,我使用ResteasyJackson2Provider ,它实现了MessageBodyReaderMessageBodyWriter ,并且可以正常工作。 Now, in Restyeasy 4, the content type check seems to be stricter and isReadable() of this same named class only accepts Content-Type of null or contains json .现在,在 Restyeasy 4 中,内容类型检查似乎更加严格,并且同一个命名类的isReadable()只接受Content-Typenull或包含json As I receive text/plain , it no longer works.当我收到text/plain时,它不再起作用。

For reading plain text, I suggest using StringTextStar .对于阅读纯文本,我建议使用StringTextStar A new class in Resteasy 4.7.5, and it seems to work. Resteasy 4.7.5 中的一个新类,它似乎可以工作。 Reading inputstream and write as string, just what I need.读取输入流并写入字符串,正是我所需要的。 Check its impl.检查它的实现。

ResteasyClient client = new ResteasyClient().uri(...)
                          .register(new ResteasyJackson2Provider()) // now only for writing
                          .register(new StringTextStar());         // use this for reading

And I think you are fine.我认为你很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 org.jboss.resteasy.client.ClientResponseFailure:无法找到内容类型为文本/纯文本且类型为类java.lang.String的MessageBodyReader - org.jboss.resteasy.client.ClientResponseFailure: Unable to find a MessageBodyReader of content-type text/plain and type class java.lang.String javax.ws.rs.ProcessingException:无法找到内容类型application / json的MessageBodyReader并输入类 - javax.ws.rs.ProcessingException: Unable to find a MessageBodyReader of content-type application/json and type class 找不到内容类型为application / octet-stream的MessageBodyReader - Unable to find a MessageBodyReader of content-type application/octet-stream RESTEasy:找不到内容类型应用程序/json 类型的编写器 - RESTEasy: Could not find writer for content-type application/json type 找不到内容类型为text / html的MessageBodyReader并键入接口java.util.List - Unable to find a MessageBodyReader of content-type text/html and type interface java.util.List Jersey REST-Client WebTarget - 找不到内容类型的 MessageBodyReader - Jersey REST-Client WebTarget - Unable to find a MessageBodyReader of content-type RestEasy - 无法找到MessageBodyReader? - RestEasy - Unable to find MessageBodyReader? RestEasy Client 无法找到内容类型应用程序/xml 类型的编写器 - RestEasy Client giving could not find writer for content-type application/xml type Maven + Resteasy JAXB找不到内容类型application / xml的编写器 - Maven + Resteasy JAXB could not find writer for content-type application/xml RESTEasy客户端。 找不到内容类型application / xml的编写器 - RESTEasy client. could not find writer for content-type application/xml
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM