Hi Łukasz,
Section 121.5.7 of the OSGi Enterprise 4.2 spec does go on to say,

"The object created this way will be the provided object of the bean
after any properties are injected. If
the factoryMethod returns a primitive type, then this primitive must
be converted to the correspond-
ing wrapper type before any usage."

Given that beans can be injected into other beans, that cannot work if
a factory-method returns a void: nor will the abovementioned cast be
possible. Spring's MethodInvokingFactoryBean states,

"Note that this factory bean will return the special
MethodInvoker.VOID singleton instance when it is used to invoke a
method which returns null, or has a void return type. While the user
of the factory bean is presumably calling the method to perform some
sort of initialization, and doesn't care about any return value, all
factory beans must return a value, so this special singleton instance
is used for this case."

While it's possible that we could implement something in Aries, I do
not believe that this use case is specifically supported by the 4.2
spec.

Regards,
Mark


2011/2/22 Łukasz Dywicki <l...@code-house.org>:
> Hello,
> I won't argue it is good or not, it's just not in line with bean specs.
> However blueprint specs says:
> #factoryMethod - A static or instance factory method name that corresponds
> to a publicly accessible method on the given class or factory manager.
>
> So it's not pointing to return value of the factory method.
>
> To be honest, it's not important for me how this combination might be done -
> it might be done just like we did this in Spring - with
> MethodInvokingFactoryBean. But I wish to don't copy unnecessary code when it
> might be done in existing. WDYT?
>
> Best regards,
> Lukasz
>
> -----Original Message-----
> From: alasdair.notting...@gmail.com [mailto:alasdair.notting...@gmail.com]
> On Behalf Of Alasdair Nottingham
> Sent: Tuesday, February 22, 2011 1:58 PM
> To: user@aries.apache.org
> Subject: Re: Void factory method
>
> Can you raise a JIRA to make the error message better?
>
> JIRA issues can be raised here: https://issues.apache.org/jira/browse/ARIES
>
> Thanks for bringing this to our attention.
> Alasdair
>
> 2011/2/22 Alasdair Nottingham <n...@apache.org>:
>> Hi,
>>
>> You can't do what you are trying to do here. The factory-method needs
>> to return an object
>> that represents the bean. In this case it returns void. It is not a
>> very nice error, we shouldn't
>> throw a NullPointerException.
>>
>> In this scenario you are defining a bean without providing an instance
>> that could back that bean.
>>
>> Alasdair
>>
>> 2011/2/22 Łukasz Dywicki <l...@code-house.org>:
>>> Hello,
>>> I have small problem with Aries. I try to configure jetty with blueprint.
>>> Jetty requires to register some objects using void methods, for example:
>>> Server.addConnector(Connector).
>>>
>>> I try to use blueprint XML:
>>>
>>>    <bean id="server" class="org.eclipse.jetty.server.Server"
>>>        init-method="start" destroy-method="stop"
>>>     />
>>>
>>>    <bean id="http" factory-ref="server" factory-method="addConnector"
>>> depends-on="jersey">
>>>        <argument>
>>>            <bean
>>> class="org.eclipse.jetty.server.nio.SelectChannelConnector">
>>>                <property name="port" value="8080" />
>>>                <property name="host" value="0.0.0.0" />
>>>            </bean>
>>>        </argument>
>>>    </bean>
>>>
>>> This configuration causes following error:
>>> org.apache.aries.blueprint - 0.2.0.incubating | Unable to start blueprint
>>> container for bundle jetty-server
>>> org.osgi.service.blueprint.container.ComponentDefinitionException: Unable
> to
>>> instantiate components
>>>        at
>>>
> org.apache.aries.blueprint.container.BlueprintContainerImpl.instantiateEager
>>>
> Components(BlueprintContainerImpl.java:628)[7:org.apache.aries.blueprint:0.2
>>> .0.incubating]
>>>        at
>>>
> org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun(BlueprintC
>>> ontainerImpl.java:315)[7:org.apache.aries.blueprint:0.2.0.incubating]
>>>        at
>>>
> org.apache.aries.blueprint.container.BlueprintContainerImpl.run(BlueprintCon
>>> tainerImpl.java:213)[7:org.apache.aries.blueprint:0.2.0.incubating]
>>>        at
>>>
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)[:1.6
>>> .0_21]
>>>        at
>>>
> java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)[:1.6.0_21
>>> ]
>>>        at
>>> java.util.concurrent.FutureTask.run(FutureTask.java:138)[:1.6.0_21]
>>>        at
>>>
> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$
>>> 301(ScheduledThreadPoolExecutor.java:98)[:1.6.0_21]
>>>        at
>>>
> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Sch
>>> eduledThreadPoolExecutor.java:207)[:1.6.0_21]
>>>        at
>>>
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.ja
>>> va:886)[:1.6.0_21]
>>>        at
>>>
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:9
>>> 08)[:1.6.0_21]
>>>        at java.lang.Thread.run(Thread.java:619)[:1.6.0_21]
>>> Caused by: java.lang.NullPointerException
>>>        at
>>>
> java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:881)[:1.6.
>>> 0_21]
>>>        at
>>>
> org.apache.aries.blueprint.container.BlueprintRepository.addPartialObject(Bl
>>>
> ueprintRepository.java:357)[7:org.apache.aries.blueprint:0.2.0.incubating]
>>>        at
>>>
> org.apache.aries.blueprint.di.AbstractRecipe.addPartialObject(AbstractRecipe
>>> .java:84)[7:org.apache.aries.blueprint:0.2.0.incubating]
>>>        at
>>>
> org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.ja
>>> va:736)[7:org.apache.aries.blueprint:0.2.0.incubating]
>>>        at
>>>
> org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:64)[
>>> 7:org.apache.aries.blueprint:0.2.0.incubating]
>>>        at
>>>
> org.apache.aries.blueprint.container.BlueprintRepository.createInstances(Blu
>>> eprintRepository.java:219)[7:org.apache.aries.blueprint:0.2.0.incubating]
>>>        at
>>>
> org.apache.aries.blueprint.container.BlueprintRepository.createAll(Blueprint
>>> Repository.java:147)[7:org.apache.aries.blueprint:0.2.0.incubating]
>>>        at
>>>
> org.apache.aries.blueprint.container.BlueprintContainerImpl.instantiateEager
>>>
> Components(BlueprintContainerImpl.java:624)[7:org.apache.aries.blueprint:0.2
>>> .0.incubating]
>>>        ... 10 more
>>>
>>>
>>>
>>
>>
>>
>> --
>> Alasdair Nottingham
>> n...@apache.org
>>
>
>
>
> --
> Alasdair Nottingham
> n...@apache.org
>
>

Reply via email to