How do you inject a list of objects?

Carl Myers
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
June 4, 2012

Say I have an interface, like WidgetGroker, and I have several implementations of WidgetGroker. I want my Component to have a class layout like this:

class JiraEventListener {

private Collection<WidgetGroker> grokers;

 

public JiraEventListener(Collection<WidgetGroker> theGrokers) {

    this.grokers = theGrokers;

}

 

@EventListener

public void eventListener(...) { .... }

// ...

}

I tried this and spring exploded with "no unique bean" errors or "no matching ctor" or whatever. Is there a way to do this? I have a <component> thing in my atlassian-plugin.xml for each implementation of WidgetGroker as well as a proper listener definition for JiraEventListener.

Thanks!

-Carl

EDIT: formatting fail =(

1 answer

1 accepted

3 votes
Answer accepted
Julien Hoarau
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
June 18, 2012

You can do that by adding a Spring configuration file in resources/META-INF/spring/plugin-components.xml

&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:osgi="http://www.springframework.org/schema/osgi"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
                                 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                                 http://www.springframework.org/schema/osgi
                                 http://www.springframework.org/schema/osgi/spring-osgi.xsd"
             default-autowire="autodetect"&gt;

  &lt;bean id="jiraEventListener" class="com.company.product.package.JiraEventListener"&gt;
    &lt;constructor-arg&gt;
      &lt;list&gt;
        &lt;ref bean="groker1"/&gt;
        &lt;ref bean="groker2"/&gt;
        &lt;ref bean="groker3"/&gt;
      &lt;/list&gt;
    &lt;/constructor-arg&gt;
  &lt;/bean&gt;

&lt;/beans&gt;

Carl Myers
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
June 18, 2012

Awesome! I will try this out and accept your answer when I get it working =D

Dennis Kromhout van der Meer
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
June 18, 2012

Hi Carl, let us know if this answer works for you :)

Carl Myers
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
July 2, 2012

Sorry it took me so long to find time to test this answer - it totally works for me! Thanks very much! =D

Carl Myers
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
July 2, 2012

BTW, if your constructor takes multiple arguments, you probably have to list them too - so my actual code looks something like this:

&lt;bean id="blah"&gt;
  &lt;constructor-arg ref="arg1"/&gt;
  &lt;constructor-arg ref="arg1"/&gt;
  &lt;constructor-arg ref="arg2"/&gt;
  &lt;constructor-arg&gt;
    &lt;list&gt;
      &lt;ref bean="arg3-item1"/&gt;
      &lt;ref bean="arg3-item2"/&gt;
    &lt;/list&gt;
  &lt;/constructor-arg&gt;
  &lt;constructor-arg ref="arg4"/&gt;
  &lt;!-- .... --&gt;
 &lt;/bean&gt;

EDIT: fixed the code - recently realized it wasn't quite right.

Suggest an answer

Log in or Sign up to answer
TAGS
AUG Leaders

Atlassian Community Events