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.morta...@xwiki.com>
wrote:

> On Wed, Oct 14, 2015 at 9:11 AM, vinc...@massol.net <vinc...@massol.net>
> wrote:
> >
> >
> > On 14 Oct 2015 at 09:00:15, vinc...@massol.net (vinc...@massol.net
> (mailto:vinc...@massol.net)) wrote:
> >
> >>
> >>
> >> On 14 Oct 2015 at 06:43:36, Marius Dumitru Florea (
> mariusdumitru.flo...@xwiki.com(mailto:mariusdumitru.flo...@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@xwiki.org
> > http://lists.xwiki.org/mailman/listinfo/users
>
>
>
> --
> Thomas Mortagne
> _______________________________________________
> users mailing list
> users@xwiki.org
> http://lists.xwiki.org/mailman/listinfo/users
>
_______________________________________________
users mailing list
users@xwiki.org
http://lists.xwiki.org/mailman/listinfo/users

Reply via email to