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 <[email protected]> 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.
>

Reply via email to