<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Georgia;
        panose-1:2 4 5 2 5 4 5 2 3 3;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
code
        {mso-style-priority:99;
        font-family:"Courier New";}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;
        mso-fareast-language:NL;}
span.EmailStyle21
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="NL" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">Google didn’t help.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">There was 2 things, first of all, I should return Response object (not String):<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:#2B2B2B"><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#BBB529">@Path</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#A9B7C6">(</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#6A8759">"/{action}"</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#A9B7C6">)<br>
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#BBB529">@GET<br>
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#CC7832">public
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#A9B7C6">Response
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#FFC66D">get</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#A9B7C6">(</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#BBB529">@PathParam</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#A9B7C6">(</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#6A8759">"action"</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#A9B7C6">)
String action) {<br>
String <span style="background:#40332B">json</span> = </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#6A8759">"{</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#CC7832">\"</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#6A8759">test</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#CC7832">\"</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#6A8759">
: </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#CC7832">\"</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#6A8759">"
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#A9B7C6">+ action +
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#6A8759">"</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#CC7832">\"</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#6A8759">}"</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#CC7832">;<br>
return </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#A9B7C6">Response.<i>ok</i>(<span style="background:#344134">json</span></span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#CC7832">,
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#A9B7C6">MediaType.</span><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#9876AA">APPLICATION_JSON_TYPE</span></i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#A9B7C6">).build()</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#CC7832">;<br>
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#A9B7C6">}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">Second thing is that you need to add dependency to module (during install) because you will get ClassNotFoundException:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">--dependencies=org.keycloak.keycloak-core,org.keycloak.keycloak-server-spi,org.keycloak.keycloak-services,javax.servlet.api,org.jboss.resteasy.resteasy-jaxrs,<b>javax.ws.rs.api</b>"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">I hope this will help other people.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">Mariusz Chruścielewski<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Stian Thorgersen [mailto:sthorger@redhat.com]
<br>
<b>Sent:</b> donderdag 29 september 2016 11:33<br>
<b>To:</b> Stian Thorgersen <stian@redhat.com><br>
<b>Cc:</b> Mariusz Chruscielewski - Info.nl <mariusz@info.nl>; keycloak-user@lists.jboss.org<br>
<b>Subject:</b> Re: [keycloak-user] Custom rest endpoint<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Also, try Googling "RESTEASY003815: Subresource for target class has no jax-rs annotations". I'm sure others has had that issue with RestEasy/JAX-RS before.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">On 29 September 2016 at 11:31, Stian Thorgersen <<a href="mailto:sthorger@redhat.com" target="_blank">sthorger@redhat.com</a>> wrote:<o:p></o:p></p>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm">
<div>
<p class="MsoNormal">Did you try the example does it work?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<div>
<p class="MsoNormal">On 28 September 2016 at 13:35, Mariusz Chruscielewski - Info.nl <<a href="mailto:mariusz@info.nl" target="_blank">mariusz@info.nl</a>> wrote:<o:p></o:p></p>
</div>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm">
<div>
<div>
<div>
<div>
<pre style="background:#2B2B2B"><span lang="EN-US">I can’t make REST endpoint work, I’m using exactly code supplied in example, I tried also to check how standard endpoints in keycloak code are created, all looks similar:<br><br><span style="color:#A9B7C6"><br></span><i><span style="color:#629755">/**<br> * <b>@author </b></span><span style="color:#77B767"><a href="mailto:<a href="mailto:sthorger@redhat.com" target="_blank">sthorger@redhat.com</a>"></span><span style="color:#629755">Stian Thorgersen</span><span style="color:#77B767"></a><br> </span><span style="color:#629755">*/<br></span></i><span style="color:#CC7832">public class </span><span style="color:#A9B7C6">HelloResourceProvider </span><span style="color:#CC7832">implements </span><span style="color:#A9B7C6">RealmResourceProvider {<br><br> </span><span style="color:#CC7832">private </span><span style="color:#A9B7C6">KeycloakSession </span><span style="color:#9876AA">session</span><span style="color:#CC7832">;<br><br> public </span><span style="color:#FFC66D">HelloResourceProvider</span><span style="color:#A9B7C6">(KeycloakSession session) {<br> </span><span style="color:#CC7832">this</span><span style="color:#A9B7C6">.</span><span style="color:#9876AA">session </span><span style="color:#A9B7C6">= session</span><span style="color:#CC7832">;<br> </span><span style="color:#A9B7C6">}<br><br> </span><span style="color:#BBB529">@GET<br> @Produces</span><span style="color:#A9B7C6">(MediaType.</span><i><span style="color:#9876AA">TEXT_HTML</span></i><span style="color:#A9B7C6">)<br> </span><span style="color:#BBB529">@Path</span><span style="color:#A9B7C6">(</span><span style="color:#6A8759">"/{action}"</span><span style="color:#A9B7C6">)<br> </span><span style="color:#CC7832">public </span><span style="color:#A9B7C6">String </span><span style="color:#FFC66D">get</span><span style="color:#A9B7C6">(</span><span style="color:#BBB529">@PathParam</span><span style="color:#A9B7C6">(</span><span style="color:#6A8759">"action"</span><span style="color:#A9B7C6">) String action) {<br> </span><span style="color:gray">//String requestUri = session.getContext().getUri().getRequestUri().toString();<br><br> </span><span style="color:#A9B7C6">String title = </span><span style="color:#6A8759">"APP_REQUEST"</span><span style="color:#CC7832">;<br> if </span><span style="color:#A9B7C6">(action.equals(</span><span style="color:#6A8759">"auth"</span><span style="color:#A9B7C6">)) {<br> title = </span><span style="color:#6A8759">"AUTH_RESPONSE"</span><span style="color:#CC7832">;<br> </span><span style="color:#A9B7C6">} </span><span style="color:#CC7832">else if </span><span style="color:#A9B7C6">(action.equals(</span><span style="color:#6A8759">"logout"</span><span style="color:#A9B7C6">)) {<br> title = </span><span style="color:#6A8759">"LOGOUT_REQUEST"</span><span style="color:#CC7832">;<br> </span><span style="color:#A9B7C6">}<br><br> StringBuilder sb = </span><span style="color:#CC7832">new </span><span style="color:#A9B7C6">StringBuilder()</span><span style="color:#CC7832">;<br> </span><span style="color:#A9B7C6">sb.append(</span><span style="color:#6A8759">"<html><head><title>" </span><span style="color:#A9B7C6">+ title + </span><span style="color:#6A8759">"</title></head><body>"</span><span style="color:#A9B7C6">)</span><span style="color:#CC7832">;<br> </span><span style="color:#A9B7C6">UriBuilder base = UriBuilder.<i>fromUri</i>(</span><span style="color:#6A8759">"<a href="http://localhost:8180/auth" target="_blank">http://localhost:8180/auth</a>"</span><span style="color:#A9B7C6">)</span><span style="color:#CC7832">;<br> </span><span style="color:#A9B7C6">sb.append(</span><span style="color:#6A8759">"<a href=</span><span style="color:#CC7832">\"</span><span style="color:#6A8759">" </span><span style="color:#A9B7C6">+ RealmsResource.<i>accountUrl</i>(base).build(</span><span style="color:#6A8759">"test"</span><span style="color:#A9B7C6">).toString() + </span><span style="color:#6A8759">"</span><span style="color:#CC7832">\"</span><span style="color:#6A8759"> id=</span><span style="color:#CC7832">\"</span><span style="color:#6A8759">account</span><span style="color:#CC7832">\"</span><span style="color:#6A8759">>account</a>"</span><span style="color:#A9B7C6">)</span><span style="color:#CC7832">;<br><br> </span><span style="color:#A9B7C6">sb.append(</span><span style="color:#6A8759">"</body></html>"</span><span style="color:#A9B7C6">)</span><span style="color:#CC7832">;<br> return </span><span style="color:#A9B7C6">sb.toString()</span><span style="color:#CC7832">;<br> </span><span style="color:#A9B7C6">}<br><br> </span><span style="color:#BBB529">@Override<br> </span><span style="color:#CC7832">public </span><span style="color:#A9B7C6">Object </span><span style="color:#FFC66D">getResource</span><span style="color:#A9B7C6">() {<br> </span><span style="color:#CC7832">return this;<br> </span><span style="color:#A9B7C6">}<br><br> </span><span style="color:#BBB529">@Override<br> </span><span style="color:#CC7832">public void </span><span style="color:#FFC66D">close</span><span style="color:#A9B7C6">() {<br> }<br><br>}</span></span><o:p></o:p></pre>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US"> </span><o:p></o:p></p>
<pre style="margin:6.0pt"><span lang="EN-US">But I’m still getting:</span><o:p></o:p></pre>
<pre style="mso-margin-top-alt:0cm;margin-right:6.0pt;margin-bottom:6.0pt;margin-left:0cm"><span lang="EN-US"> </span><o:p></o:p></pre>
<pre style="margin:6.0pt"><code><span lang="EN-US" style="font-family:Consolas;color:black">RESTEASY003815: Subresource for target class has no jax-rs annotations.: nl.vi.keycloak.providers.rest.HelloResourceProvider</span></code><o:p></o:p></pre>
<pre style="margin:6.0pt"><code><span lang="EN-US" style="font-family:Consolas;color:black"> </span></code><o:p></o:p></pre>
<pre style="margin:6.0pt"><code><span lang="EN-US" style="font-family:Consolas;color:black">Can you please help me? Thanks</span></code><o:p></o:p></pre>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="461" style="width:345.65pt">
<tbody>
<tr style="height:11.15pt">
<td style="padding:0cm 0cm 0cm 0cm;height:11.15pt">
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;line-height:12.0pt">
<span style="font-size:10.0pt;font-family:"Georgia",serif;color:black">Kind Regards,</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;line-height:12.0pt">
<span style="font-size:10.0pt;font-family:"Georgia",serif;color:black"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;line-height:12.0pt">
<span style="font-size:10.0pt;font-family:"Georgia",serif;color:black">Mariusz Chruscielewski</span><o:p></o:p></p>
</td>
</tr>
<tr style="height:11.15pt">
<td style="padding:0cm 0cm 15.0pt 0cm;height:11.15pt">
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;line-height:12.0pt">
<span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia",serif;color:black">Software Engineer | <a href="mailto:mariusz@info.nl" target="_blank">mariusz@info.nl</a> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;line-height:12.0pt">
<span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia",serif;color:black">+31 (0)20 530 91 13 |
<a href="tel:%2B48%20695%20555%20292" target="_blank">+48 695 555 292</a> </span>
<o:p></o:p></p>
</td>
</tr>
<tr style="height:15.3pt">
<td style="padding:0cm 0cm 3.0pt 0cm;height:15.3pt">
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;line-height:16.0pt">
<span style="font-size:10.0pt;font-family:"Georgia",serif;color:black"><a href="http://www.info.nl/" target="_blank"><span lang="EN-US" style="font-size:14.0pt;color:white;background:black">info.nl</span><span lang="EN-US"> </span></a><a href="http://www.info.nl/nl?utm_source=e-mail_sig&utm_medium=e-mail&utm_term=connecting_the_dots&utm_campaign=info_sig" target="_blank"><i><span lang="EN-US" style="color:black">making
platforms work</span></i></a></span><o:p></o:p></p>
</td>
</tr>
<tr style="height:11.15pt">
<td style="padding:0cm 0cm 15.0pt 0cm;height:11.15pt">
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;line-height:12.0pt">
<span style="font-size:10.0pt;font-family:"Georgia",serif;color:black">Sint Antoniesbreestraat 16 | 1011 HB Amsterdam | +31 (0)20 530 91 11</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;line-height:12.0pt">
<span style="font-size:10.0pt;font-family:"Georgia",serif"><a href="https://www.facebook.com/infonl" target="_blank">Facebook</a> |
<a href="https://twitter.com/infonl" target="_blank">Twitter</a> | <a href="https://www.linkedin.com/company/info-nl" target="_blank">
LinkedIn</a> | <a href="https://plus.google.com/+infonl/" target="_blank">Google+</a></span><o:p></o:p></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
<p class="MsoNormal">_______________________________________________<br>
keycloak-user mailing list<br>
<a href="mailto:keycloak-user@lists.jboss.org" target="_blank">keycloak-user@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/keycloak-user" target="_blank">https://lists.jboss.org/mailman/listinfo/keycloak-user</a><o:p></o:p></p>
</blockquote>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</blockquote>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</body>
</html>