Thanks for the suggestion, that worked.
Changing the @Inject to use the @Role (interface) instead of the @Component
(the concrete class) fixed the issue :) Thanks for your help :)
Out of curiosity, how does the Component manager know which concrete
implementation to pick? Since I have only one component, does it
automatically use that for the @Inject?
On Wed, Oct 14, 2015 at 2:02 AM, Thomas Mortagne <thomas.mortagne(a)xwiki.com>
wrote:
On Wed, Oct 14, 2015 at 9:11 AM, vincent(a)massol.net
<vincent(a)massol.net>
wrote:
On 14 Oct 2015 at 09:00:15, vincent(a)massol.net (vincent(a)massol.net
(mailto:vincent@massol.net)) wrote:
>
>
> On 14 Oct 2015 at 06:43:36, Marius Dumitru Florea (
mariusdumitru.florea@xwiki.com(mailto:mariusdumitru.florea@xwiki.com))
wrote:
>
> > Hi Debajit,
> >
> > On Oct 14, 2015 01:17, "Debajit Adhikary" wrote:
> > >
> > > I created an XWiki component which is available as a jar file.
> > >
> > > I have a ScriptService class for the component too:
> > >
> > > ----
> > >
> > > @Role
> > > public interface SearchClient
> > > {
> > > String search();
> > > }
> > >
> > > ----
> > >
> > > @Component
> > > @Singleton
> > > public class InternalSearchClient implements SearchClient
> > > {
> > > public String search()
> > > {
> > > return "test search results";
> > > }
> > > }
> > >
> > > ----
> > >
> > > @Component
> > > @Named("internalSearch")
> > > @Singleton
> > > public class InternalSearchScriptService implements ScriptService
> > > {
> >
> > > @Inject
> > > private InternalSearchClient searchClient;
> >
> > You need to "inject" the role (interface), not directly the
implementation.
> > That's why you use the Component
Manager. Othewise you could have
simply
> > used the "new" operator to
instantiate yourself the component.
>
> Good catch, didn’t see it when I replied yesterday! :)
>
> I guess we could catch this in the AnnotationComponentLoader and report
an
error.
Actually, the Component Manager should raise an error if it fails to
inject a
field. I was sure it was doing that, strange. I’ll debug it.
It does.
Thanks
-Vincent
> Thanks
> -Vincent
>
> > Hope this helps,
> > Marius
> >
> > >
> > > public String search()
> > > {
> > > return this.searchClient.search();
> > > }
> > > }
> > >
> > > ----
> > >
> > > I've added all the above files into their own jar with a
components.txt
> > > file:
> > >
> > > com.mycompany.wiki.search.InternalSearchClient
> > > com.mycompany.wiki.search.InternalSearchScriptService
> > >
> > > and in my Wiki's pom.xml, I have the following:
> > >
> > >
> > > org.xwiki.commons
> > > xwiki-commons-script
> > > ${commons.version}
> > >
> > >
> > >
> > > Now from my Wiki page, when I do the following:
> > >
> > > {{groovy}}
> > > println(services.internalSearch.search())
> > > {{/groovy}}
> > >
> > > I get an error message saying "java.lang.NullPointerException:
Cannot
> > > invoke method search() on null
object"
> > >
> > > What am I doing wrong here?
> > >
> > > (I followed the directions in
> > >
http://platform.xwiki.org/xwiki/bin/view/DevGuide/WritingComponents
— have
> > > these directions changed, and/or is
there anything else I need to
do? )
_______________________________________________
users mailing list
users(a)xwiki.org
http://lists.xwiki.org/mailman/listinfo/users
--
Thomas Mortagne
_______________________________________________
users mailing list
users(a)xwiki.org
http://lists.xwiki.org/mailman/listinfo/users