使用 JAVA 通过 REST API 集成 Keycloak 时在 toRepresentation() 获取 404
Getting 404 at toRepresentation() when integrating Keycloak via REST API using JAVA
我正在尝试连接到本地主机上的 Keycloak 实例 运行 并使用 userid
查找特定用户。我已经在 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>
错误堆栈:
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)
类似问题:
https://keycloak.discourse.group/t/404-when-calling-torepresentation/3606
问题在于这部分:
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();
您应该将 master
传递给 .realm(..)
,因为那通常是客户 admin-cli
所在的位置。
一个运行解决方案:
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());
}
}
我正在尝试连接到本地主机上的 Keycloak 实例 运行 并使用 userid
查找特定用户。我已经在 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>
错误堆栈:
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)
类似问题:
https://keycloak.discourse.group/t/404-when-calling-torepresentation/3606
问题在于这部分:
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();
您应该将 master
传递给 .realm(..)
,因为那通常是客户 admin-cli
所在的位置。
一个运行解决方案:
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());
}
}