Java 实现SPI以扩展KeyClope API-找不到资源

Java 实现SPI以扩展KeyClope API-找不到资源,java,api,keycloak,spi,Java,Api,Keycloak,Spi,我正在尝试在KeyClope服务器上创建一个自定义资源,以扩展其RESTAPI。所以我正在实现一个SPI。从一个你好的世界开始 目前,我的目标是通过一个GET-on获得一个“hello”+姓名 我使用邮递员向服务器发送请求。我可以在myRealm上获得一个用户令牌。我在领域管理映射器中选择已为其分配角色查看用户的用户 因此,内置的keydepeat管理API可以工作。 例如: 返回预期的用户计数 但问题是我有一个 “错误”:“RESTEASY003210:无法找到完整路径的资源:”请求此终结点时

我正在尝试在KeyClope服务器上创建一个自定义资源,以扩展其RESTAPI。所以我正在实现一个SPI。从一个你好的世界开始

目前,我的目标是通过一个GET-on获得一个“hello”+姓名

我使用邮递员向服务器发送请求。我可以在myRealm上获得一个用户令牌。我在
领域管理
映射器中选择已为其分配角色
查看用户
的用户

因此,内置的keydepeat管理API可以工作。 例如: 返回预期的用户计数

但问题是我有一个 “错误”:“RESTEASY003210:无法找到完整路径的资源:”请求此终结点时

这是我的设置(我读了几本指南):

模块项目的pom.xml包含对
keydape核心
keydape服务器spi
keydape服务器spi私有
org.jboss.spec.javax.ws.rs

RealmResourceProvider实现:

public class HelloWorldProvider implements RealmResourceProvider {

    private KeycloakSession session;

    public HelloWorldProvider(KeycloakSession session) {
        this.session = session;
    }

    @Override
    public Object getResource() {
        return this;
    }

    @GET
    @Path("/hello")
    @Produces("text/plain; charset=utf-8")
    public String get() {
        String name = session.getContext().getRealm().getDisplayName();
        if (name == null) {
            name = session.getContext().getRealm().getName();
        }
        return "Hello" + name;
    }

    @Override
    public void close() {
    }
}
public class HelloWorldProviderFactory implements RealmResourceProviderFactory {

    public static final String ID = "hello";

    @Override
    public String getId() {
        return ID;
    }

    @Override
    public int order() {
        return 0;
    }

    @Override
    public RealmResourceProvider create(KeycloakSession keycloakSession) {
        return new HelloWorldProvider(keycloakSession);
    }

    @Override
    public void init(Config.Scope scope) {
    }

    @Override
    public void postInit(KeycloakSessionFactory keycloakSessionFactory) {
    }

    @Override
    public void close() {
    }
}
工厂实施:

public class HelloWorldProvider implements RealmResourceProvider {

    private KeycloakSession session;

    public HelloWorldProvider(KeycloakSession session) {
        this.session = session;
    }

    @Override
    public Object getResource() {
        return this;
    }

    @GET
    @Path("/hello")
    @Produces("text/plain; charset=utf-8")
    public String get() {
        String name = session.getContext().getRealm().getDisplayName();
        if (name == null) {
            name = session.getContext().getRealm().getName();
        }
        return "Hello" + name;
    }

    @Override
    public void close() {
    }
}
public class HelloWorldProviderFactory implements RealmResourceProviderFactory {

    public static final String ID = "hello";

    @Override
    public String getId() {
        return ID;
    }

    @Override
    public int order() {
        return 0;
    }

    @Override
    public RealmResourceProvider create(KeycloakSession keycloakSession) {
        return new HelloWorldProvider(keycloakSession);
    }

    @Override
    public void init(Config.Scope scope) {
    }

    @Override
    public void postInit(KeycloakSessionFactory keycloakSessionFactory) {
    }

    @Override
    public void close() {
    }
}
我还创建了文件
src\main\resources\META-INF\org.keydeport.services.resource.RealmResourceProviderFactory
它包含对my
HelloWorldProviderFactory

打包jar后,我将其副本放入
keydove-9.0.3\standalone\deployments
中,运行
standalone.bat
后,将创建文件
keydove-spi-rest-hello-1.0.jar.deployed

http://localhost:8080/auth/admin/realms/myRealm/hello/hello

因为第一个“hello”是工厂ID的名称,而第二个“hello”是您在服务上设置的路径