Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting 404 at toRepresentation() when integrating Keycloak via REST API using JAVA

I am trying to connect to a Keycloak instance running on localhost and find a specific user using userid. I have already created a relevant Realm, users, etc in the Keycloak.

TestKeycloakConnection.java

package org.keycloak.pkg.test;

import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.keycloak.admin.client.Keycloak;
import org.keycloak.admin.client.KeycloakBuilder;
import org.keycloak.admin.client.resource.UserResource;
import org.keycloak.admin.client.resource.UsersResource;

public class TestKeycloakConnection {

    public static final String KEYCLOAK_URL = "https://localhost/auth";
    public static final String KEYCLOAK_REALM = "myreaml";
    public static final String KEYCLOAK_USER = "admin";
    public static final String KEYCLOAK_PASSWORD = "admin";
    public static final String KEYCLOAK_ADMIN_CLI = "admin-cli";

  public static void main(String[] args) {
    Keycloak keycloak = KeycloakBuilder
        .builder()
        .serverUrl(KEYCLOAK_URL)
        .realm(KEYCLOAK_REALM)
        .username(KEYCLOAK_USER)
        .password(KEYCLOAK_PASSWORD)
        .clientId(KEYCLOAK_ADMIN_CLI)
        .resteasyClient(new ResteasyClientBuilder().connectionPoolSize(10).build())
        .build();
    UsersResource usersResource = keycloak.realm(KEYCLOAK_REALM).users();
    UserResource userResource = usersResource.get("8af231bd-0305-4921-a52d-6c0dda224e24");

    ////////////////////// GETTING 404 IN FOLLOWING LINE ////////////////////
    System.out.println("userResource:"+userResource.toRepresentation().getUsername());
  }
}

pom.xml

<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-admin-client</artifactId>
    <version>12.0.2</version>
</dependency>
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jaxrs</artifactId>
    <version>3.15.0.Alpha1</version>
</dependency>
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-client</artifactId>
    <version>3.0.26.Final</version>
</dependency>
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jackson2-provider</artifactId>
    <version>3.1.0.Final</version>
</dependency>

Error Stack:

Exception in thread "main" javax.ws.rs.ProcessingException: javax.ws.rs.NotFoundException: HTTP 404 Not Found at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.invoke(ClientInvocation.java:436) at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientInvoker.invoke(ClientInvoker.java:106) at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientProxy.invoke(ClientProxy.java:76) at com.sun.proxy.$Proxy27.toRepresentation(Unknown Source) at org.keycloak.pkg.providers.config.TestKeycloakConnection.main(TestKeycloakConnection.java:41) Caused by: javax.ws.rs.NotFoundException: HTTP 404 Not Found at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.handleErrorStatus(ClientInvocation.java:200)

Similar question:

https://keycloak.discourse.group/t/404-when-calling-torepresentation/3606

like image 529
Afee Avatar asked Sep 16 '25 15:09

Afee


1 Answers

The problem is that in this part:

   Keycloak keycloak = KeycloakBuilder
        .builder()
        .serverUrl(KEYCLOAK_URL)
        .realm(KEYCLOAK_REALM) // <----- this is wrong
        .username(KEYCLOAK_USER) 
        .password(KEYCLOAK_PASSWORD)
        .clientId(KEYCLOAK_ADMIN_CLI)
        .resteasyClient(new ResteasyClientBuilder().connectionPoolSize(10).build())
        .build();

to the .realm(..) you should pass master since that is where typically the client admin-cli is.

A running solution:

package org.keycloak.pkg.test;

import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.keycloak.admin.client.Keycloak;
import org.keycloak.admin.client.KeycloakBuilder;
import org.keycloak.admin.client.resource.UserResource;
import org.keycloak.admin.client.resource.UsersResource;

public class TestKeycloakConnection {

    public static final String KEYCLOAK_URL = "https://localhost/auth";
    public static final String KEYCLOAK_REALM = "myreaml";
    public static final String KEYCLOAK_USER = "admin";
    public static final String KEYCLOAK_PASSWORD = "admin";
    public static final String KEYCLOAK_ADMIN_CLI = "admin-cli";

  public static void main(String[] args) {
    Keycloak keycloak = KeycloakBuilder
        .builder()
        .serverUrl(KEYCLOAK_URL)
        .realm("master")
        .username(KEYCLOAK_USER)
        .password(KEYCLOAK_PASSWORD)
        .clientId(KEYCLOAK_ADMIN_CLI)
        .resteasyClient(new ResteasyClientBuilder().connectionPoolSize(10).build())
        .build();
    UsersResource usersResource = keycloak.realm(KEYCLOAK_REALM).users();
    UserResource userResource = usersResource.get("8af231bd-0305-4921-a52d-6c0dda224e24");
 System.out.println("userResource:"+userResource.toRepresentation().getUsername());
  }
}
like image 50
dreamcrash Avatar answered Sep 18 '25 09:09

dreamcrash