We had to specify the class loader of the interface we wanted to make into a client. <br><br>Take a look at this code:<br><a href="http://github.com/Smartling/keycloak-user-migration-provider/blob/master/user-migration-federation-provider/src/main/java/com/smartling/keycloak/provider/RemoteUserFederationProvider.java">github.com/Smartling/keycloak-user-migration-provider/blob/master/user-migration-federation-provider/src/main/java/com/smartling/keycloak/provider/RemoteUserFederationProvider.java</a><br><div class="gmail_quote"><div dir="ltr">On Tue, Sep 6, 2016 at 7:45 PM Crafton Williams &lt;<a href="mailto:crafton.williams@qut.edu.au">crafton.williams@qut.edu.au</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">




<div dir="ltr">
<div style="font-size:12pt;color:#000000;background-color:#ffffff;font-family:Calibri,Arial,Helvetica,sans-serif">
<p>Hi all:</p>
<p><br>
</p>
<p>I&#39;m in the process of developing a web service-based User Federation SPI. I&#39;ve gone through the properties SPI example and had a look at the ldap and kerberos SPIs. They seem pretty straightforward and at first glance I think I&#39;ve implemented things properly.
 For my service requests, I&#39;m using the Resteasy client through the proxy interface with a few simple calls to test things out. When I package and deploy, Keycloak doesn&#39;t seem to complain, however when I search for a user, i get the following trace:</p>
<p></p>
<div><i>09:20:20,956 ERROR [io.undertow.request] (default task-15) UT005023: Exception handling request to /auth/admin/realms/master/users: org.jboss.resteasy.spi.UnhandledException: java.lang.IllegalArgumentException: interface org.keycloak.federation.ws.client.WsServiceClient
 is not visible from class loader</i></div>
<div><i><span style="white-space:pre-wrap"></span>at org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:76)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java:212)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:168)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:411)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:202)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:221)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at org.keycloak.services.filters.KeycloakSessionServletFilter.doFilter(KeycloakSessionServletFilter.java:90)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:284)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:263)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:174)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:793)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)</i></div>
<div><i><span style="white-space:pre-wrap"></span>at java.lang.Thread.run(Thread.java:745)</i></div>
<div><i><br>
</i></div>
<div>Some details about my environment:</div>
<div>Keycloak version: 2.1.0.Final, running in standalone mode</div>
<div>Java version: 1.8.0_101</div>
<div><br>
</div>
<div>Project structure:</div>
<div><a href="http://or.keycloak.federation.ws" target="_blank">or.keycloak.federation.ws</a></div>
<div><i>-client</i></div>
<div><i>--WsServiceClient.java</i></div>
<div><i>-ServiceModel.java</i></div>
<div><i>-WsFederationProvider.java</i></div>
<div><i>-WsFederationProviderFactory.java</i></div>
<div><i><br>
</i></div>
<div><i>-resources</i></div>
<div><i>--META-INF.services</i></div>
<div><i>---org.keycloak.models.UserFederationProviderFactory</i></div>
<div><br>
</div>
<div><br>
</div>
<div>My getInstance for the factory class looks like this:</div>
<div>
<pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:&#39;DejaVu Sans Mono&#39;;font-size:10.5pt"><span style="color:#bbb529">@Override<br></span><span style="color:#cc7832">public </span>WsFederationProvider <span style="color:#ffc66d">getInstance</span>(KeycloakSession session<span style="color:#cc7832">, </span>UserFederationProviderModel model) {<br>    ResteasyClient client = <span style="color:#cc7832">new </span><span style="color:#cc7833">ResteasyClientBuilder</span>().<span style="color:#cc7833">build</span>()<span style="color:#cc7832">;<br></span><span style="color:#cc7832">    </span>ResteasyWebTarget target = client.<span style="color:#cc7833">target</span>(<span style="color:#9876aa;font-style:italic">BASE_URL</span>)<span style="color:#cc7832">;<br></span><span style="color:#cc7832">    </span><span style="font-size:10.5pt">WsClientService</span><span style="font-size:10.5pt"> serviceClient = target.</span><span style="font-size:10.5pt;color:rgb(204,120,51)">proxy</span><span style="font-size:10.5pt">(</span><span style="font-size:10.5pt">WsClientService</span><span style="font-size:10.5pt">.</span><span style="font-size:10.5pt;color:rgb(204,120,50)">class</span><span style="font-size:10.5pt">)</span><span style="font-size:10.5pt;color:rgb(204,120,50)">;</span><span style="color:#cc7832"><br></span><span style="color:#cc7832"><br></span><span style="color:#cc7832">    return new </span><span style="color:#cc7833">WsFederationProvider</span>(session<span style="color:#cc7832">, </span>model<span style="color:#cc7832">, </span>serviceClient)<span style="color:#cc7832">;<br></span>}</pre>
<div>All dependencies in my POM are &#39;provided&#39;, so i&#39;ve already ensured that the libraries aren&#39;t duplicated.</div>
<div><br>
</div>
Based on my research so far, this seems to be the preferred way to instantiate the RestClient to ensure the classloader picks it up on boot, however I&#39;m still getting the exception. Can anybody provide any clues? </div>
<div><br>
</div>
<div><br>
</div>
<div><br>
</div>
<i></i>Regards,
<p></p>
<p><br>
</p>
<p>Crafton</p>
<p><br>
</p>
</div>
</div>

_______________________________________________<br>
keycloak-dev mailing list<br>
<a href="mailto:keycloak-dev@lists.jboss.org" target="_blank">keycloak-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/keycloak-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/keycloak-dev</a></blockquote></div>