Hi guys,

in my scenario I want to realize a "template method". For this I implement 
common abstract base class:

public abstract AbstractFooProducer {

    protected void init() {}

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

and then one or more specific implementations:

public class XmlFooProducer extends AbstractFooProducer {
    @Override
    protected void init() {
        // wicked xml initialization done here
    }
}

Now, this solution is causing me some headache to realize, here are number of 
wrong assumptions I made:

- I assumed that,  because AbstractFooProducer is abstract, OWB will activate 
XmlFooProducer as the only concrete implementation and will recognize @Produces 
method through the inheritance. No, does not happen!
- Ok, next assumption is that if I decorate XmlFooProducer with @Specializes I 
will get the behavior described above. No and from this point on i always get 
this same exception from OWB: InconsistentSpecializationException(not sure if 
the name is correct since am writing this by heart but it is thrown by 
OWBBeanUtil during configureSpecializations());
- Next, I will add @Alternative on top of @Specializes and activate it to make 
it work (as described in oracle docs for CDI). Result - the said 
InconsistentSpecializationException;
- Next, I will @Override the @Produces method from abstract class in the 
concrete implementation (i read some place that specializing class fully 
"replaces" specialized class and interpreted this so that i have to replicate 
then all relevant Cdi annotations). No, the same exception is thrown;

At this point i am out of ideas and would appretiate a hint or two on how to 
make it work.

br
Reinis


Reply via email to