You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomee.apache.org by Reinis Vicups <to...@orbit-x.de> on 2013/05/27 15:57:18 UTC

Abstract producer method cause UnsatisfiedResolutionException

Hello,

I have three classes

public abstract class AbstractFooProducer {

     protected void init(Foo foo) {}

     @Produces
     public Foo produceFoo() {
         Foo foo = new Foo();
         init(foo);
         return foo;
     }
}

then

public class ConcreteFooProducer extends AbstractFooProducer {
     @Override
     protected void init(Foo foo) {
         foo.setI(234);
     }
}

and

@Typed(Object.class)
public class Foo {
...
}

Foo is annotated with @Typed to avoid CDI directly injecting Foo in 
injection points.

This cause following exception:

javax.enterprise.inject.UnsatisfiedResolutionException: Api type 
[de.orbitx.specializes.Foo] is not found with the qualifiers
Qualifiers: [@javax.enterprise.inject.Default()]
for injection into Field Injection Point, field name :  foo, Bean Owner 
: [FooTest, Name:null, WebBeans Type:ENTERPRISE, API 
Types:[java.lang.Object,de.orbitx.specializes.FooTest,java.io.Serializable], 
Qualifiers:[javax.enterprise.inject.Default,javax.enterprise.inject.Any]]
     at 
org.apache.webbeans.util.InjectionExceptionUtil.throwUnsatisfiedResolutionException(InjectionExceptionUtil.java:77)
     at 
org.apache.webbeans.container.InjectionResolver.checkInjectionPoints(InjectionResolver.java:178)
     at 
org.apache.webbeans.container.BeanManagerImpl.validate(BeanManagerImpl.java:947)
     at 
org.apache.webbeans.config.BeansDeployer.validate(BeansDeployer.java:440)
     at 
org.apache.webbeans.config.BeansDeployer.validateInjectionPoints(BeansDeployer.java:390)
     at 
org.apache.webbeans.config.BeansDeployer.deploy(BeansDeployer.java:194)
     at 
org.apache.openejb.cdi.OpenEJBLifecycle.startApplication(OpenEJBLifecycle.java:182)
     at 
org.apache.openejb.cdi.ThreadSingletonServiceImpl.initialize(ThreadSingletonServiceImpl.java:158)
     at org.apache.openejb.cdi.CdiBuilder.build(CdiBuilder.java:43)
     at 
org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:798)
     at 
org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:612)
     at 
org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:608)
     at 
org.apache.openejb.testing.ApplicationComposers.before(ApplicationComposers.java:580)
     at 
org.apache.openejb.testing.ApplicationComposers.evaluate(ApplicationComposers.java:664)
     at 
org.apache.openejb.junit.ApplicationComposer$DeployApplication.evaluate(ApplicationComposer.java:64)
     at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
     at 
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
     at 
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
     at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
     at 
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
     at 
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
     at 
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
     at 
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
     at 
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
     at 
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Why is AbstractFooProducer#produceFoo() not seen by CDI?

I am also attaching a test project

Thank you very much for your hints
Reinis.

Re: Abstract producer method cause UnsatisfiedResolutionException

Posted by Reinis Vicups <to...@orbit-x.de>.
I finally have understood what Romain was suggesting all this time.

I am attaching example project to demonstrate this for all of you who 
are still in doubt about the solution.

@Romain - thank you for the super hint!

br
reinis

On 28.05.2013 23:17, Romain Manni-Bucau wrote:
> Why not get the Init bean in the producer and get it activated through
> alternative?
> Le 28 mai 2013 23:13, "Reinis Vicups" <to...@orbit-x.de> a écrit :
>
>> Thank you for the hints.
>>
>> Alas, am still struggling with realization of template method.
>>
>> I tried different approaches now and am unable to find the "clean"
>> implementation for my problem. Ok thats my problem and not a CDI issue, but
>> just for the sake of completeness I'd like to show the solution I now have
>> and to put the disadvantages to the discussion.
>>
>> So now I changed AbstractFooProducer to
>>
>> class BaseFooProducer {
>>      protected void init(Foo foo) {
>>          throw new NotImplementedException();
>>      }
>>
>>      @Produces
>>      public Foo produceFoo() {
>>          //method template goes here e.g. init()
>>      }
>> }
>>
>> and
>>
>> @Specializes
>> public class ConcreteFooProducer extends BaseFooProducer {
>>      @Override
>>      protected void init(Foo foo) {
>>          foo.setI(234);
>>      }
>> }
>>
>> This works as expected but is no elegant solution I would get with an
>> abstract base class.
>>
>> Someone suggested me to use @Alternative but I don't see how that can help
>> me. I don't have different implementations for the same interface but,
>> rather, I want to enforce particular program flow and allow descendants to
>> implement parts of it in a specific way (e.g. load data from xml source or
>> otherwise).
>>
>> Would be great if someone could suggest me a pattern for this.
>>
>> br
>> Reinis
>>
>> On 27.05.2013 22:50, John D. Ament wrote:
>>
>>> The answer's in the spec (JSR-299)
>>>
>>> A producer method must be a non-abstract method of a managed bean class or
>>> session bean class.
>>>
>>> Your abstract class is neither a managed bean nor a session bean.
>>>
>>> I also confirmed that your project doesn't run with weld.
>>>
>>>
>>> On Mon, May 27, 2013 at 9:57 AM, Reinis Vicups <to...@orbit-x.de> wrote:
>>>
>>>   Hello,
>>>> I have three classes
>>>>
>>>> public abstract class AbstractFooProducer {
>>>>
>>>>       protected void init(Foo foo) {}
>>>>
>>>>       @Produces
>>>>       public Foo produceFoo() {
>>>>           Foo foo = new Foo();
>>>>           init(foo);
>>>>           return foo;
>>>>       }
>>>> }
>>>>
>>>> then
>>>>
>>>> public class ConcreteFooProducer extends AbstractFooProducer {
>>>>       @Override
>>>>       protected void init(Foo foo) {
>>>>           foo.setI(234);
>>>>       }
>>>> }
>>>>
>>>> and
>>>>
>>>> @Typed(Object.class)
>>>> public class Foo {
>>>> ...
>>>> }
>>>>
>>>> Foo is annotated with @Typed to avoid CDI directly injecting Foo in
>>>> injection points.
>>>>
>>>> This cause following exception:
>>>>
>>>> javax.enterprise.inject.****UnsatisfiedResolutionException****: Api type
>>>> [de.orbitx.specializes.Foo] is not found with the qualifiers
>>>> Qualifiers: [@javax.enterprise.inject.****Default()]
>>>> for injection into Field Injection Point, field name :  foo, Bean Owner :
>>>> [FooTest, Name:null, WebBeans Type:ENTERPRISE, API
>>>> Types:[java.lang.Object,de.****orbitx.specializes.FooTest,****
>>>> java.io.Serializable],
>>>> Qualifiers:[javax.enterprise.****inject.Default,javax.**
>>>> enterprise.inject.Any]]
>>>>       at org.apache.webbeans.util.****InjectionExceptionUtil.**
>>>> throwUnsatisfiedResolutionExce****ption(**InjectionExceptionUtil.**java:
>>>> **77)
>>>>       at org.apache.webbeans.container.****InjectionResolver.**
>>>> checkInjectionPoints(****InjectionResolver.java:178)
>>>>       at org.apache.webbeans.container.****BeanManagerImpl.validate(**
>>>> BeanManagerImpl.java:947)
>>>>       at org.apache.webbeans.config.****BeansDeployer.validate(**
>>>> BeansDeployer.java:440)
>>>>       at org.apache.webbeans.config.****BeansDeployer.**
>>>> validateInjectionPoints(****BeansDeployer.java:390)
>>>>       at org.apache.webbeans.config.****BeansDeployer.deploy(**
>>>> BeansDeployer.java:194)
>>>>       at org.apache.openejb.cdi.****OpenEJBLifecycle.****
>>>> startApplication(**
>>>> OpenEJBLifecycle.java:182)
>>>>       at org.apache.openejb.cdi.****ThreadSingletonServiceImpl.****
>>>> initialize(**
>>>> ThreadSingletonServiceImpl.****java:158)
>>>>       at org.apache.openejb.cdi.****CdiBuilder.build(CdiBuilder.****
>>>> java:43)
>>>>       at org.apache.openejb.assembler.****classic.Assembler.**
>>>> createApplication(Assembler.****java:798)
>>>>       at org.apache.openejb.assembler.****classic.Assembler.**
>>>> createApplication(Assembler.****java:612)
>>>>       at org.apache.openejb.assembler.****classic.Assembler.**
>>>> createApplication(Assembler.****java:608)
>>>>       at org.apache.openejb.testing.****ApplicationComposers.before(**
>>>> ApplicationComposers.java:580)
>>>>       at org.apache.openejb.testing.****ApplicationComposers.evaluate(**
>>>> **
>>>> ApplicationComposers.java:664)
>>>>       at org.apache.openejb.junit.****ApplicationComposer$**
>>>> DeployApplication.evaluate(****ApplicationComposer.java:64)
>>>>       at org.junit.runners.****ParentRunner.runLeaf(****
>>>> ParentRunner.java:263)
>>>>       at org.junit.runners.****BlockJUnit4ClassRunner.****runChild(**
>>>> BlockJUnit4ClassRunner.java:****68)
>>>>       at org.junit.runners.****BlockJUnit4ClassRunner.****runChild(**
>>>> BlockJUnit4ClassRunner.java:****47)
>>>>       at org.junit.runners.****ParentRunner$3.run(****
>>>> ParentRunner.java:231)
>>>>       at org.junit.runners.****ParentRunner$1.schedule(****
>>>> ParentRunner.java:60)
>>>>       at org.junit.runners.****ParentRunner.runChildren(**
>>>> ParentRunner.java:229)
>>>>       at org.junit.runners.****ParentRunner.access$000(****
>>>> ParentRunner.java:50)
>>>>       at org.junit.runners.****ParentRunner$2.evaluate(**
>>>> ParentRunner.java:222)
>>>>       at org.junit.runners.****ParentRunner.run(ParentRunner.**
>>>> **java:300)
>>>>       at org.eclipse.jdt.internal.****junit4.runner.****
>>>> JUnit4TestReference.run(
>>>> **JUnit4TestReference.java:50)
>>>>       at org.eclipse.jdt.internal.****junit.runner.TestExecution.**
>>>> run(TestExecution.java:38)
>>>>       at org.eclipse.jdt.internal.****junit.runner.RemoteTestRunner.****
>>>> runTests(RemoteTestRunner.****java:467)
>>>>       at org.eclipse.jdt.internal.****junit.runner.RemoteTestRunner.****
>>>> runTests(RemoteTestRunner.****java:683)
>>>>       at org.eclipse.jdt.internal.****junit.runner.RemoteTestRunner.****
>>>> run(RemoteTestRunner.java:390)
>>>>       at org.eclipse.jdt.internal.****junit.runner.RemoteTestRunner.****
>>>> main(RemoteTestRunner.java:****197)
>>>>
>>>> Why is AbstractFooProducer#****produceFoo() not seen by CDI?
>>>>
>>>> I am also attaching a test project
>>>>
>>>> Thank you very much for your hints
>>>> Reinis.
>>>>
>>>>


Re: Abstract producer method cause UnsatisfiedResolutionException

Posted by Romain Manni-Bucau <rm...@gmail.com>.
Why not get the Init bean in the producer and get it activated through
alternative?
Le 28 mai 2013 23:13, "Reinis Vicups" <to...@orbit-x.de> a écrit :

> Thank you for the hints.
>
> Alas, am still struggling with realization of template method.
>
> I tried different approaches now and am unable to find the "clean"
> implementation for my problem. Ok thats my problem and not a CDI issue, but
> just for the sake of completeness I'd like to show the solution I now have
> and to put the disadvantages to the discussion.
>
> So now I changed AbstractFooProducer to
>
> class BaseFooProducer {
>     protected void init(Foo foo) {
>         throw new NotImplementedException();
>     }
>
>     @Produces
>     public Foo produceFoo() {
>         //method template goes here e.g. init()
>     }
> }
>
> and
>
> @Specializes
> public class ConcreteFooProducer extends BaseFooProducer {
>     @Override
>     protected void init(Foo foo) {
>         foo.setI(234);
>     }
> }
>
> This works as expected but is no elegant solution I would get with an
> abstract base class.
>
> Someone suggested me to use @Alternative but I don't see how that can help
> me. I don't have different implementations for the same interface but,
> rather, I want to enforce particular program flow and allow descendants to
> implement parts of it in a specific way (e.g. load data from xml source or
> otherwise).
>
> Would be great if someone could suggest me a pattern for this.
>
> br
> Reinis
>
> On 27.05.2013 22:50, John D. Ament wrote:
>
>> The answer's in the spec (JSR-299)
>>
>> A producer method must be a non-abstract method of a managed bean class or
>> session bean class.
>>
>> Your abstract class is neither a managed bean nor a session bean.
>>
>> I also confirmed that your project doesn't run with weld.
>>
>>
>> On Mon, May 27, 2013 at 9:57 AM, Reinis Vicups <to...@orbit-x.de> wrote:
>>
>>  Hello,
>>>
>>> I have three classes
>>>
>>> public abstract class AbstractFooProducer {
>>>
>>>      protected void init(Foo foo) {}
>>>
>>>      @Produces
>>>      public Foo produceFoo() {
>>>          Foo foo = new Foo();
>>>          init(foo);
>>>          return foo;
>>>      }
>>> }
>>>
>>> then
>>>
>>> public class ConcreteFooProducer extends AbstractFooProducer {
>>>      @Override
>>>      protected void init(Foo foo) {
>>>          foo.setI(234);
>>>      }
>>> }
>>>
>>> and
>>>
>>> @Typed(Object.class)
>>> public class Foo {
>>> ...
>>> }
>>>
>>> Foo is annotated with @Typed to avoid CDI directly injecting Foo in
>>> injection points.
>>>
>>> This cause following exception:
>>>
>>> javax.enterprise.inject.****UnsatisfiedResolutionException****: Api type
>>> [de.orbitx.specializes.Foo] is not found with the qualifiers
>>> Qualifiers: [@javax.enterprise.inject.****Default()]
>>> for injection into Field Injection Point, field name :  foo, Bean Owner :
>>> [FooTest, Name:null, WebBeans Type:ENTERPRISE, API
>>> Types:[java.lang.Object,de.****orbitx.specializes.FooTest,****
>>> java.io.Serializable],
>>> Qualifiers:[javax.enterprise.****inject.Default,javax.**
>>> enterprise.inject.Any]]
>>>      at org.apache.webbeans.util.****InjectionExceptionUtil.**
>>> throwUnsatisfiedResolutionExce****ption(**InjectionExceptionUtil.**java:
>>> **77)
>>>      at org.apache.webbeans.container.****InjectionResolver.**
>>> checkInjectionPoints(****InjectionResolver.java:178)
>>>      at org.apache.webbeans.container.****BeanManagerImpl.validate(**
>>> BeanManagerImpl.java:947)
>>>      at org.apache.webbeans.config.****BeansDeployer.validate(**
>>> BeansDeployer.java:440)
>>>      at org.apache.webbeans.config.****BeansDeployer.**
>>> validateInjectionPoints(****BeansDeployer.java:390)
>>>      at org.apache.webbeans.config.****BeansDeployer.deploy(**
>>> BeansDeployer.java:194)
>>>      at org.apache.openejb.cdi.****OpenEJBLifecycle.****
>>> startApplication(**
>>> OpenEJBLifecycle.java:182)
>>>      at org.apache.openejb.cdi.****ThreadSingletonServiceImpl.****
>>> initialize(**
>>> ThreadSingletonServiceImpl.****java:158)
>>>      at org.apache.openejb.cdi.****CdiBuilder.build(CdiBuilder.****
>>> java:43)
>>>      at org.apache.openejb.assembler.****classic.Assembler.**
>>> createApplication(Assembler.****java:798)
>>>      at org.apache.openejb.assembler.****classic.Assembler.**
>>> createApplication(Assembler.****java:612)
>>>      at org.apache.openejb.assembler.****classic.Assembler.**
>>> createApplication(Assembler.****java:608)
>>>      at org.apache.openejb.testing.****ApplicationComposers.before(**
>>> ApplicationComposers.java:580)
>>>      at org.apache.openejb.testing.****ApplicationComposers.evaluate(**
>>> **
>>> ApplicationComposers.java:664)
>>>      at org.apache.openejb.junit.****ApplicationComposer$**
>>> DeployApplication.evaluate(****ApplicationComposer.java:64)
>>>      at org.junit.runners.****ParentRunner.runLeaf(****
>>> ParentRunner.java:263)
>>>      at org.junit.runners.****BlockJUnit4ClassRunner.****runChild(**
>>> BlockJUnit4ClassRunner.java:****68)
>>>      at org.junit.runners.****BlockJUnit4ClassRunner.****runChild(**
>>> BlockJUnit4ClassRunner.java:****47)
>>>      at org.junit.runners.****ParentRunner$3.run(****
>>> ParentRunner.java:231)
>>>      at org.junit.runners.****ParentRunner$1.schedule(****
>>> ParentRunner.java:60)
>>>      at org.junit.runners.****ParentRunner.runChildren(**
>>> ParentRunner.java:229)
>>>      at org.junit.runners.****ParentRunner.access$000(****
>>> ParentRunner.java:50)
>>>      at org.junit.runners.****ParentRunner$2.evaluate(**
>>> ParentRunner.java:222)
>>>      at org.junit.runners.****ParentRunner.run(ParentRunner.**
>>> **java:300)
>>>      at org.eclipse.jdt.internal.****junit4.runner.****
>>> JUnit4TestReference.run(
>>> **JUnit4TestReference.java:50)
>>>      at org.eclipse.jdt.internal.****junit.runner.TestExecution.**
>>> run(TestExecution.java:38)
>>>      at org.eclipse.jdt.internal.****junit.runner.RemoteTestRunner.****
>>> runTests(RemoteTestRunner.****java:467)
>>>      at org.eclipse.jdt.internal.****junit.runner.RemoteTestRunner.****
>>> runTests(RemoteTestRunner.****java:683)
>>>      at org.eclipse.jdt.internal.****junit.runner.RemoteTestRunner.****
>>> run(RemoteTestRunner.java:390)
>>>      at org.eclipse.jdt.internal.****junit.runner.RemoteTestRunner.****
>>> main(RemoteTestRunner.java:****197)
>>>
>>> Why is AbstractFooProducer#****produceFoo() not seen by CDI?
>>>
>>> I am also attaching a test project
>>>
>>> Thank you very much for your hints
>>> Reinis.
>>>
>>>
>

Re: Abstract producer method cause UnsatisfiedResolutionException

Posted by Reinis Vicups <to...@orbit-x.de>.
Thank you for the hints.

Alas, am still struggling with realization of template method.

I tried different approaches now and am unable to find the "clean" 
implementation for my problem. Ok thats my problem and not a CDI issue, 
but just for the sake of completeness I'd like to show the solution I 
now have and to put the disadvantages to the discussion.

So now I changed AbstractFooProducer to

class BaseFooProducer {
     protected void init(Foo foo) {
         throw new NotImplementedException();
     }

     @Produces
     public Foo produceFoo() {
         //method template goes here e.g. init()
     }
}

and

@Specializes
public class ConcreteFooProducer extends BaseFooProducer {
     @Override
     protected void init(Foo foo) {
         foo.setI(234);
     }
}

This works as expected but is no elegant solution I would get with an 
abstract base class.

Someone suggested me to use @Alternative but I don't see how that can 
help me. I don't have different implementations for the same interface 
but, rather, I want to enforce particular program flow and allow 
descendants to implement parts of it in a specific way (e.g. load data 
from xml source or otherwise).

Would be great if someone could suggest me a pattern for this.

br
Reinis

On 27.05.2013 22:50, John D. Ament wrote:
> The answer's in the spec (JSR-299)
>
> A producer method must be a non-abstract method of a managed bean class or
> session bean class.
>
> Your abstract class is neither a managed bean nor a session bean.
>
> I also confirmed that your project doesn't run with weld.
>
>
> On Mon, May 27, 2013 at 9:57 AM, Reinis Vicups <to...@orbit-x.de> wrote:
>
>> Hello,
>>
>> I have three classes
>>
>> public abstract class AbstractFooProducer {
>>
>>      protected void init(Foo foo) {}
>>
>>      @Produces
>>      public Foo produceFoo() {
>>          Foo foo = new Foo();
>>          init(foo);
>>          return foo;
>>      }
>> }
>>
>> then
>>
>> public class ConcreteFooProducer extends AbstractFooProducer {
>>      @Override
>>      protected void init(Foo foo) {
>>          foo.setI(234);
>>      }
>> }
>>
>> and
>>
>> @Typed(Object.class)
>> public class Foo {
>> ...
>> }
>>
>> Foo is annotated with @Typed to avoid CDI directly injecting Foo in
>> injection points.
>>
>> This cause following exception:
>>
>> javax.enterprise.inject.**UnsatisfiedResolutionException**: Api type
>> [de.orbitx.specializes.Foo] is not found with the qualifiers
>> Qualifiers: [@javax.enterprise.inject.**Default()]
>> for injection into Field Injection Point, field name :  foo, Bean Owner :
>> [FooTest, Name:null, WebBeans Type:ENTERPRISE, API
>> Types:[java.lang.Object,de.**orbitx.specializes.FooTest,**java.io.Serializable],
>> Qualifiers:[javax.enterprise.**inject.Default,javax.**
>> enterprise.inject.Any]]
>>      at org.apache.webbeans.util.**InjectionExceptionUtil.**
>> throwUnsatisfiedResolutionExce**ption(InjectionExceptionUtil.**java:77)
>>      at org.apache.webbeans.container.**InjectionResolver.**
>> checkInjectionPoints(**InjectionResolver.java:178)
>>      at org.apache.webbeans.container.**BeanManagerImpl.validate(**
>> BeanManagerImpl.java:947)
>>      at org.apache.webbeans.config.**BeansDeployer.validate(**
>> BeansDeployer.java:440)
>>      at org.apache.webbeans.config.**BeansDeployer.**
>> validateInjectionPoints(**BeansDeployer.java:390)
>>      at org.apache.webbeans.config.**BeansDeployer.deploy(**
>> BeansDeployer.java:194)
>>      at org.apache.openejb.cdi.**OpenEJBLifecycle.**startApplication(**
>> OpenEJBLifecycle.java:182)
>>      at org.apache.openejb.cdi.**ThreadSingletonServiceImpl.**initialize(**
>> ThreadSingletonServiceImpl.**java:158)
>>      at org.apache.openejb.cdi.**CdiBuilder.build(CdiBuilder.**java:43)
>>      at org.apache.openejb.assembler.**classic.Assembler.**
>> createApplication(Assembler.**java:798)
>>      at org.apache.openejb.assembler.**classic.Assembler.**
>> createApplication(Assembler.**java:612)
>>      at org.apache.openejb.assembler.**classic.Assembler.**
>> createApplication(Assembler.**java:608)
>>      at org.apache.openejb.testing.**ApplicationComposers.before(**
>> ApplicationComposers.java:580)
>>      at org.apache.openejb.testing.**ApplicationComposers.evaluate(**
>> ApplicationComposers.java:664)
>>      at org.apache.openejb.junit.**ApplicationComposer$**
>> DeployApplication.evaluate(**ApplicationComposer.java:64)
>>      at org.junit.runners.**ParentRunner.runLeaf(**ParentRunner.java:263)
>>      at org.junit.runners.**BlockJUnit4ClassRunner.**runChild(**
>> BlockJUnit4ClassRunner.java:**68)
>>      at org.junit.runners.**BlockJUnit4ClassRunner.**runChild(**
>> BlockJUnit4ClassRunner.java:**47)
>>      at org.junit.runners.**ParentRunner$3.run(**ParentRunner.java:231)
>>      at org.junit.runners.**ParentRunner$1.schedule(**ParentRunner.java:60)
>>      at org.junit.runners.**ParentRunner.runChildren(**
>> ParentRunner.java:229)
>>      at org.junit.runners.**ParentRunner.access$000(**ParentRunner.java:50)
>>      at org.junit.runners.**ParentRunner$2.evaluate(**
>> ParentRunner.java:222)
>>      at org.junit.runners.**ParentRunner.run(ParentRunner.**java:300)
>>      at org.eclipse.jdt.internal.**junit4.runner.**JUnit4TestReference.run(
>> **JUnit4TestReference.java:50)
>>      at org.eclipse.jdt.internal.**junit.runner.TestExecution.**
>> run(TestExecution.java:38)
>>      at org.eclipse.jdt.internal.**junit.runner.RemoteTestRunner.**
>> runTests(RemoteTestRunner.**java:467)
>>      at org.eclipse.jdt.internal.**junit.runner.RemoteTestRunner.**
>> runTests(RemoteTestRunner.**java:683)
>>      at org.eclipse.jdt.internal.**junit.runner.RemoteTestRunner.**
>> run(RemoteTestRunner.java:390)
>>      at org.eclipse.jdt.internal.**junit.runner.RemoteTestRunner.**
>> main(RemoteTestRunner.java:**197)
>>
>> Why is AbstractFooProducer#**produceFoo() not seen by CDI?
>>
>> I am also attaching a test project
>>
>> Thank you very much for your hints
>> Reinis.
>>


Re: Abstract producer method cause UnsatisfiedResolutionException

Posted by "John D. Ament" <jo...@gmail.com>.
The answer's in the spec (JSR-299)

A producer method must be a non-abstract method of a managed bean class or
session bean class.

Your abstract class is neither a managed bean nor a session bean.

I also confirmed that your project doesn't run with weld.


On Mon, May 27, 2013 at 9:57 AM, Reinis Vicups <to...@orbit-x.de> wrote:

> Hello,
>
> I have three classes
>
> public abstract class AbstractFooProducer {
>
>     protected void init(Foo foo) {}
>
>     @Produces
>     public Foo produceFoo() {
>         Foo foo = new Foo();
>         init(foo);
>         return foo;
>     }
> }
>
> then
>
> public class ConcreteFooProducer extends AbstractFooProducer {
>     @Override
>     protected void init(Foo foo) {
>         foo.setI(234);
>     }
> }
>
> and
>
> @Typed(Object.class)
> public class Foo {
> ...
> }
>
> Foo is annotated with @Typed to avoid CDI directly injecting Foo in
> injection points.
>
> This cause following exception:
>
> javax.enterprise.inject.**UnsatisfiedResolutionException**: Api type
> [de.orbitx.specializes.Foo] is not found with the qualifiers
> Qualifiers: [@javax.enterprise.inject.**Default()]
> for injection into Field Injection Point, field name :  foo, Bean Owner :
> [FooTest, Name:null, WebBeans Type:ENTERPRISE, API
> Types:[java.lang.Object,de.**orbitx.specializes.FooTest,**java.io.Serializable],
> Qualifiers:[javax.enterprise.**inject.Default,javax.**
> enterprise.inject.Any]]
>     at org.apache.webbeans.util.**InjectionExceptionUtil.**
> throwUnsatisfiedResolutionExce**ption(InjectionExceptionUtil.**java:77)
>     at org.apache.webbeans.container.**InjectionResolver.**
> checkInjectionPoints(**InjectionResolver.java:178)
>     at org.apache.webbeans.container.**BeanManagerImpl.validate(**
> BeanManagerImpl.java:947)
>     at org.apache.webbeans.config.**BeansDeployer.validate(**
> BeansDeployer.java:440)
>     at org.apache.webbeans.config.**BeansDeployer.**
> validateInjectionPoints(**BeansDeployer.java:390)
>     at org.apache.webbeans.config.**BeansDeployer.deploy(**
> BeansDeployer.java:194)
>     at org.apache.openejb.cdi.**OpenEJBLifecycle.**startApplication(**
> OpenEJBLifecycle.java:182)
>     at org.apache.openejb.cdi.**ThreadSingletonServiceImpl.**initialize(**
> ThreadSingletonServiceImpl.**java:158)
>     at org.apache.openejb.cdi.**CdiBuilder.build(CdiBuilder.**java:43)
>     at org.apache.openejb.assembler.**classic.Assembler.**
> createApplication(Assembler.**java:798)
>     at org.apache.openejb.assembler.**classic.Assembler.**
> createApplication(Assembler.**java:612)
>     at org.apache.openejb.assembler.**classic.Assembler.**
> createApplication(Assembler.**java:608)
>     at org.apache.openejb.testing.**ApplicationComposers.before(**
> ApplicationComposers.java:580)
>     at org.apache.openejb.testing.**ApplicationComposers.evaluate(**
> ApplicationComposers.java:664)
>     at org.apache.openejb.junit.**ApplicationComposer$**
> DeployApplication.evaluate(**ApplicationComposer.java:64)
>     at org.junit.runners.**ParentRunner.runLeaf(**ParentRunner.java:263)
>     at org.junit.runners.**BlockJUnit4ClassRunner.**runChild(**
> BlockJUnit4ClassRunner.java:**68)
>     at org.junit.runners.**BlockJUnit4ClassRunner.**runChild(**
> BlockJUnit4ClassRunner.java:**47)
>     at org.junit.runners.**ParentRunner$3.run(**ParentRunner.java:231)
>     at org.junit.runners.**ParentRunner$1.schedule(**ParentRunner.java:60)
>     at org.junit.runners.**ParentRunner.runChildren(**
> ParentRunner.java:229)
>     at org.junit.runners.**ParentRunner.access$000(**ParentRunner.java:50)
>     at org.junit.runners.**ParentRunner$2.evaluate(**
> ParentRunner.java:222)
>     at org.junit.runners.**ParentRunner.run(ParentRunner.**java:300)
>     at org.eclipse.jdt.internal.**junit4.runner.**JUnit4TestReference.run(
> **JUnit4TestReference.java:50)
>     at org.eclipse.jdt.internal.**junit.runner.TestExecution.**
> run(TestExecution.java:38)
>     at org.eclipse.jdt.internal.**junit.runner.RemoteTestRunner.**
> runTests(RemoteTestRunner.**java:467)
>     at org.eclipse.jdt.internal.**junit.runner.RemoteTestRunner.**
> runTests(RemoteTestRunner.**java:683)
>     at org.eclipse.jdt.internal.**junit.runner.RemoteTestRunner.**
> run(RemoteTestRunner.java:390)
>     at org.eclipse.jdt.internal.**junit.runner.RemoteTestRunner.**
> main(RemoteTestRunner.java:**197)
>
> Why is AbstractFooProducer#**produceFoo() not seen by CDI?
>
> I am also attaching a test project
>
> Thank you very much for your hints
> Reinis.
>