[picocontainer-scm] [jira] Commented: (PICO-375) ProviderAdapter#getComponentInstance(PicoContainer, Type) uses provider's type
"Johann Burkard (JIRA)" <jira-yCVjj/[email protected]> Wed, 3 Nov 2010 16:33:03 -0500 (CDT)
| Newsgroups | gmane.comp.java.picocontainer.cvs |
|---|---|
| Message-ID | <17685850.2714.1288819983771.JavaMail.haus-jira@codehaus01.managed.contegix.com> |
[ http://jira.codehaus.org/browse/PICO-375?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=242009#action_242009 ]
Johann Burkard commented on PICO-375:
-------------------------------------
Uhm, make that
{code}
if (injectionMethod.getReturnType().isAssignableFrom(componentImplementation) || injectionMethod.getDeclaringClass().isAssignableFrom(componentImplementation)) {
{code}
> ProviderAdapter#getComponentInstance(PicoContainer, Type) uses provider's type
> ------------------------------------------------------------------------------
>
> Key: PICO-375
> URL: http://jira.codehaus.org/browse/PICO-375
> Project: PicoContainer
> Issue Type: Bug
> Components: PicoContainer (Java)
> Affects Versions: 2.11
> Reporter: Johann Burkard
>
> I think I found a bug in PicoContainer's {{ProviderAdapter}}:
> If I use a {{Provider}}, the class of the provider is used during reinjection and not the type that's being returned by the provide method of the {{Provider}}. The corresponding lines of code are:
> {code}
> public Object getComponentInstance(PicoContainer container, Type into) throws PicoCompositionException {
> return new Reinjector(container).reinject(key, provider.getClass(), provider, properties, new MethodInjection(provideMethod));
> }
> {code}
> I guess this should rather be
> {code}
> public Object getComponentInstance(PicoContainer container, Type into) throws PicoCompositionException {
> return new Reinjector(container).reinject(key, key, provider, properties, new MethodInjection(provideMethod));
> }
> {code}
> Also, since ProviderAdapter takes {{Object}} and not {{Provider}}, you might want to set the {{Provider}} interface to deprecated since it's no longer needed.
> Test case!
> {code}
> @Test
> public void providerTest() {
> DefaultPicoContainer container = new DefaultPicoContainer();
>
> ProviderAdapter adapter = new ProviderAdapter(new BlorbProvider());
>
> container.addAdapter(adapter);
>
> assertNotNull(container.getComponent(Blorb.class));
>
> }
>
> public static class BlorbProvider {
>
> public Blorb provide() {
> return new Blorb();
> }
>
> }
>
> public static class Blorb {}
> {code}
> Expected result: Returns a Blorb. Actual result: java.lang.ClassCastException: com.eaio.concurrent.DynamicBlockingQueueTest$BlorbProvider is not a com.eaio.concurrent.DynamicBlockingQueueTest$Blorb
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
<hr/>
<p>
To unsubscribe from this list please visit:
</p>
<p>
<a href="http://xircles.codehaus.org/manage_email">http://xircles.codehaus.org/manage_email</a>