You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomee.apache.org by to...@orbit-x.de on 2013/05/19 16:27:10 UTC
Re[2]: [OWB] CDI - how to realize default producer?
Thank you guys for the excellent info!
Now that i know what to search for, theres actually some discussion going on over this subject in internet.
Although it works for me, i have the feeling that both solutions (@Typed and @Veto) are rather workarounds (i saw on stacktrace one more suggestion to annotate the bean to be produced with @Alternative without enabling it) because the intent of those annotations is different(?)
Just for the sake of completeness, why would @Default or @New or @Any together with @Produces on producer method will not work?
Br
Reinis
-----Ursprüngliche Nachricht-----
Betreff: Re: [OWB] CDI - how to realize default producer?
Von: "Mark Struberg" <st...@yahoo.de>
An: users@tomee.apache.org
Datum: 2013/05/19 14:40:52
Yes, it's kind of different to ProcessAnnotatedType#veto(), but it has the same effect - your class and your producer don't clash anymore ;)
And it comes without any expenses straight out of CDI-1.0
LieGrue,
strub
----- Original Message -----
> From: John D. Ament <jo...@gmail.com>
> To: users@tomee.apache.org; Mark Struberg <st...@yahoo.de>
> Cc:
> Sent: Sunday, 19 May 2013, 14:14
> Subject: Re: [OWB] CDI - how to realize default producer?
>
> Well, I think @Typed is another work around. It doesn't remove the object
> from the archive simply says you can't reference it by anything but
> what's
> in @Typed.
>
>
> On Sun, May 19, 2013 at 6:19 AM, Mark Struberg <st...@yahoo.de> wrote:
>
>> CDI-1.0 _has_ a concept of vetoing. Simply annotate Foo with
>>
>> @Typed()
>>
>> LieGrue,
>> strub
>>
>>
>>
>>
>> ----- Original Message -----
>> > From: John D. Ament <jo...@gmail.com>
>> > To: users@tomee.apache.org
>> > Cc:
>> > Sent: Sunday, 19 May 2013, 4:37
>> > Subject: Re: [OWB] CDI - how to realize default producer?
>> >
>> >T he easiest way is to actually put a qualifier on the class itself,
> and
>> > then never inject based on that qualifier. CDI 1.0 has no concept of
> a
>> > veto'd bean, but you could write an extension yourself that
> veto'd your
>> > class.
>> >
>> > Extensions exist out there, I believe CODI has one and Seam3 has one.
>> > Seam3 uses @Veto to mark these beans as veto'd.
>> >
>> >
>> > On Sat, May 18, 2013 at 6:48 PM, Reinis Vicups
> <to...@orbit-x.de> wrote:
>> >
>> >> Hi,
>> >>
>> >> I'd like to use a producer method in ALL CASES when
> @Injecting a
>> >> particular bean.
>> >>
>> >> It looks like this:
>> >>
>> >> public class FooProducer {
>> >>
>> >> @Produces
>> >> public Foo produceFoo() {
>> >> Foo foo = new Foo();
>> >> return foo;
>> >> }
>> >> }
>> >>
>> >> public class Foo {}
>> >>
>> >> With this example I get:
>> >>
>> >> SEVERE - CDI Beans module deployment failed
>> >> javax.enterprise.inject.**AmbiguousResolutionException: Ambiguous
>> >> resolution
>> >> found beans:
>> >> Foo, Name:null, WebBeans Type:MANAGED, API
>> > Types:[....Foo,java.lang.**Object],
>> >> Qualifiers:[javax.enterprise.**inject.Any,javax.enterprise.**
>> >> inject.Default]
>> >> Foo, Name:null, WebBeans Type:PRODUCERMETHOD, API
>> Types:[....Foo,java.lang.
>> >> **Object],
>> Qualifiers:[javax.enterprise.**inject.Any,javax.enterprise.**
>> >> inject.Default]
>> >>
>> >> I tried applying @Default with no success.
>> >>
>> >> And I don't want to make specific @Qualifier annotation,
> because this
>> > is
>> >> unnecessary in my case and will cause errors in those cases when
> I
>> forget
>> >> to provide that @Qualifier at injection point.
>> >>
>> >> If anyone could help me with setting up a correct way to provide
>> default
>> >> producer, would be great.
>> >>
>> >> thanks and kind regards
>> >> Reinis
>> >>
>> >
>>
>
Re: Re[2]: [OWB] CDI - how to realize default producer?
Posted by Mark Struberg <st...@yahoo.de>.
There are a few ways to solve this riddle, but I personally prefer the ones who are readable.
Some containers fail if you don't have a default ct -> not a perfect solution.
I also don't really like @Alternative, because it is really confusing. A later maintainer of the code will not easily see that this is only for disabling it and is never intended to get listed as <alternatives> in beans.xml
@Typed still looks the cleanest to me.
LieGrue,
strub
----- Original Message -----
> From: "Howard W. Smith, Jr." <sm...@gmail.com>
> To: users@tomee.apache.org
> Cc: Mark Struberg <st...@yahoo.de>
> Sent: Sunday, 19 May 2013, 21:25
> Subject: Re: Re[2]: [OWB] CDI - how to realize default producer?
>
> +1 OP and responses!
>
>
> On Sun, May 19, 2013 at 1:24 PM, Romain Manni-Bucau
> <rm...@gmail.com>wrote:
>
>> by default your bean will be a managed bean so injectable, just add
>> anything to prevent it (constructor without @Inject for instance) and
>> you'll remove the conflict.
>>
>>
>> veto = remove it from cdi (= handled manually)
>> Typed() = keep it in cdi but for Object type only (as all beans)
>>
>> @Any ~= i don't care about details just give me it!
>> @Default = just because in cdi identity is type + qualifier so we need a
>> default one ;)
>>
>> *Romain Manni-Bucau*
>> *Twitter: @rmannibucau <https://twitter.com/rmannibucau>*
>> *Blog: **http://rmannibucau.wordpress.com/*<
>> http://rmannibucau.wordpress.com/>
>> *LinkedIn: **http://fr.linkedin.com/in/rmannibucau*
>> *Github: https://github.com/rmannibucau*
>>
>>
>>
>> 2013/5/19 <to...@orbit-x.de>
>>
>> > Thank you guys for the excellent info!
>> >
>> > Now that i know what to search for, theres actually some discussion
> going
>> > on over this subject in internet.
>> >
>> > Although it works for me, i have the feeling that both solutions
> (@Typed
>> > and @Veto) are rather workarounds (i saw on stacktrace one more
>> suggestion
>> > to annotate the bean to be produced with @Alternative without enabling
>> it)
>> > because the intent of those annotations is different(?)
>> >
>> > Just for the sake of completeness, why would @Default or @New or @Any
>> > together with @Produces on producer method will not work?
>> >
>> > Br
>> > Reinis
>> >
>> >
>> > -----Ursprüngliche Nachricht-----
>> > Betreff: Re: [OWB] CDI - how to realize default producer?
>> > Von: "Mark Struberg" <st...@yahoo.de>
>> > An: users@tomee.apache.org
>> > Datum: 2013/05/19 14:40:52
>> >
>> > Yes, it's kind of different to ProcessAnnotatedType#veto(), but it
> has
>> the
>> > same effect - your class and your producer don't clash anymore ;)
>> >
>> > And it comes without any expenses straight out of CDI-1.0
>> >
>> > LieGrue,
>> > strub
>> >
>> >
>> >
>> >
>> > ----- Original Message -----
>> > > From: John D. Ament <jo...@gmail.com>
>> > > To: users@tomee.apache.org; Mark Struberg
> <st...@yahoo.de>
>> > > Cc:
>> > > Sent: Sunday, 19 May 2013, 14:14
>> > > Subject: Re: [OWB] CDI - how to realize default producer?
>> > >
>> > > Well, I think @Typed is another work around. It doesn't
> remove the
>> > object
>> > > from the archive simply says you can't reference it by
> anything but
>> > > what's
>> > > in @Typed.
>> > >
>> > >
>> > > On Sun, May 19, 2013 at 6:19 AM, Mark Struberg
> <st...@yahoo.de>
>> > wrote:
>> > >
>> > >> CDI-1.0 _has_ a concept of vetoing. Simply annotate Foo with
>> > >>
>> > >> @Typed()
>> > >>
>> > >> LieGrue,
>> > >> strub
>> > >>
>> > >>
>> > >>
>> > >>
>> > >> ----- Original Message -----
>> > >> > From: John D. Ament <jo...@gmail.com>
>> > >> > To: users@tomee.apache.org
>> > >> > Cc:
>> > >> > Sent: Sunday, 19 May 2013, 4:37
>> > >> > Subject: Re: [OWB] CDI - how to realize default
> producer?
>> > >> >
>> > >> >T he easiest way is to actually put a qualifier on the
> class itself,
>> > > and
>> > >> > then never inject based on that qualifier. CDI 1.0 has
> no concept
>> of
>> > > a
>> > >> > veto'd bean, but you could write an extension
> yourself that
>> > > veto'd your
>> > >> > class.
>> > >> >
>> > >> > Extensions exist out there, I believe CODI has one and
> Seam3 has
>> one.
>> > >> > Seam3 uses @Veto to mark these beans as veto'd.
>> > >> >
>> > >> >
>> > >> > On Sat, May 18, 2013 at 6:48 PM, Reinis Vicups
>> > > <to...@orbit-x.de> wrote:
>> > >> >
>> > >> >> Hi,
>> > >> >>
>> > >> >> I'd like to use a producer method in ALL CASES
> when
>> > > @Injecting a
>> > >> >> particular bean.
>> > >> >>
>> > >> >> It looks like this:
>> > >> >>
>> > >> >> public class FooProducer {
>> > >> >>
>> > >> >> @Produces
>> > >> >> public Foo produceFoo() {
>> > >> >> Foo foo = new Foo();
>> > >> >> return foo;
>> > >> >> }
>> > >> >> }
>> > >> >>
>> > >> >> public class Foo {}
>> > >> >>
>> > >> >> With this example I get:
>> > >> >>
>> > >> >> SEVERE - CDI Beans module deployment failed
>> > >> >>
> javax.enterprise.inject.**AmbiguousResolutionException: Ambiguous
>> > >> >> resolution
>> > >> >> found beans:
>> > >> >> Foo, Name:null, WebBeans Type:MANAGED, API
>> > >> > Types:[....Foo,java.lang.**Object],
>> > >> >>
> Qualifiers:[javax.enterprise.**inject.Any,javax.enterprise.**
>> > >> >> inject.Default]
>> > >> >> Foo, Name:null, WebBeans Type:PRODUCERMETHOD, API
>> > >> Types:[....Foo,java.lang.
>> > >> >> **Object],
>> > >>
> Qualifiers:[javax.enterprise.**inject.Any,javax.enterprise.**
>> > >> >> inject.Default]
>> > >> >>
>> > >> >> I tried applying @Default with no success.
>> > >> >>
>> > >> >> And I don't want to make specific @Qualifier
> annotation,
>> > > because this
>> > >> > is
>> > >> >> unnecessary in my case and will cause errors in
> those cases when
>> > > I
>> > >> forget
>> > >> >> to provide that @Qualifier at injection point.
>> > >> >>
>> > >> >> If anyone could help me with setting up a correct
> way to provide
>> > >> default
>> > >> >> producer, would be great.
>> > >> >>
>> > >> >> thanks and kind regards
>> > >> >> Reinis
>> > >> >>
>> > >> >
>> > >>
>> > >
>> >
>> >
>> >
>> >
>> >
>>
>
Re: Re[2]: [OWB] CDI - how to realize default producer?
Posted by "Howard W. Smith, Jr." <sm...@gmail.com>.
+1 OP and responses!
On Sun, May 19, 2013 at 1:24 PM, Romain Manni-Bucau
<rm...@gmail.com>wrote:
> by default your bean will be a managed bean so injectable, just add
> anything to prevent it (constructor without @Inject for instance) and
> you'll remove the conflict.
>
>
> veto = remove it from cdi (= handled manually)
> Typed() = keep it in cdi but for Object type only (as all beans)
>
> @Any ~= i don't care about details just give me it!
> @Default = just because in cdi identity is type + qualifier so we need a
> default one ;)
>
> *Romain Manni-Bucau*
> *Twitter: @rmannibucau <https://twitter.com/rmannibucau>*
> *Blog: **http://rmannibucau.wordpress.com/*<
> http://rmannibucau.wordpress.com/>
> *LinkedIn: **http://fr.linkedin.com/in/rmannibucau*
> *Github: https://github.com/rmannibucau*
>
>
>
> 2013/5/19 <to...@orbit-x.de>
>
> > Thank you guys for the excellent info!
> >
> > Now that i know what to search for, theres actually some discussion going
> > on over this subject in internet.
> >
> > Although it works for me, i have the feeling that both solutions (@Typed
> > and @Veto) are rather workarounds (i saw on stacktrace one more
> suggestion
> > to annotate the bean to be produced with @Alternative without enabling
> it)
> > because the intent of those annotations is different(?)
> >
> > Just for the sake of completeness, why would @Default or @New or @Any
> > together with @Produces on producer method will not work?
> >
> > Br
> > Reinis
> >
> >
> > -----Ursprüngliche Nachricht-----
> > Betreff: Re: [OWB] CDI - how to realize default producer?
> > Von: "Mark Struberg" <st...@yahoo.de>
> > An: users@tomee.apache.org
> > Datum: 2013/05/19 14:40:52
> >
> > Yes, it's kind of different to ProcessAnnotatedType#veto(), but it has
> the
> > same effect - your class and your producer don't clash anymore ;)
> >
> > And it comes without any expenses straight out of CDI-1.0
> >
> > LieGrue,
> > strub
> >
> >
> >
> >
> > ----- Original Message -----
> > > From: John D. Ament <jo...@gmail.com>
> > > To: users@tomee.apache.org; Mark Struberg <st...@yahoo.de>
> > > Cc:
> > > Sent: Sunday, 19 May 2013, 14:14
> > > Subject: Re: [OWB] CDI - how to realize default producer?
> > >
> > > Well, I think @Typed is another work around. It doesn't remove the
> > object
> > > from the archive simply says you can't reference it by anything but
> > > what's
> > > in @Typed.
> > >
> > >
> > > On Sun, May 19, 2013 at 6:19 AM, Mark Struberg <st...@yahoo.de>
> > wrote:
> > >
> > >> CDI-1.0 _has_ a concept of vetoing. Simply annotate Foo with
> > >>
> > >> @Typed()
> > >>
> > >> LieGrue,
> > >> strub
> > >>
> > >>
> > >>
> > >>
> > >> ----- Original Message -----
> > >> > From: John D. Ament <jo...@gmail.com>
> > >> > To: users@tomee.apache.org
> > >> > Cc:
> > >> > Sent: Sunday, 19 May 2013, 4:37
> > >> > Subject: Re: [OWB] CDI - how to realize default producer?
> > >> >
> > >> >T he easiest way is to actually put a qualifier on the class itself,
> > > and
> > >> > then never inject based on that qualifier. CDI 1.0 has no concept
> of
> > > a
> > >> > veto'd bean, but you could write an extension yourself that
> > > veto'd your
> > >> > class.
> > >> >
> > >> > Extensions exist out there, I believe CODI has one and Seam3 has
> one.
> > >> > Seam3 uses @Veto to mark these beans as veto'd.
> > >> >
> > >> >
> > >> > On Sat, May 18, 2013 at 6:48 PM, Reinis Vicups
> > > <to...@orbit-x.de> wrote:
> > >> >
> > >> >> Hi,
> > >> >>
> > >> >> I'd like to use a producer method in ALL CASES when
> > > @Injecting a
> > >> >> particular bean.
> > >> >>
> > >> >> It looks like this:
> > >> >>
> > >> >> public class FooProducer {
> > >> >>
> > >> >> @Produces
> > >> >> public Foo produceFoo() {
> > >> >> Foo foo = new Foo();
> > >> >> return foo;
> > >> >> }
> > >> >> }
> > >> >>
> > >> >> public class Foo {}
> > >> >>
> > >> >> With this example I get:
> > >> >>
> > >> >> SEVERE - CDI Beans module deployment failed
> > >> >> javax.enterprise.inject.**AmbiguousResolutionException: Ambiguous
> > >> >> resolution
> > >> >> found beans:
> > >> >> Foo, Name:null, WebBeans Type:MANAGED, API
> > >> > Types:[....Foo,java.lang.**Object],
> > >> >> Qualifiers:[javax.enterprise.**inject.Any,javax.enterprise.**
> > >> >> inject.Default]
> > >> >> Foo, Name:null, WebBeans Type:PRODUCERMETHOD, API
> > >> Types:[....Foo,java.lang.
> > >> >> **Object],
> > >> Qualifiers:[javax.enterprise.**inject.Any,javax.enterprise.**
> > >> >> inject.Default]
> > >> >>
> > >> >> I tried applying @Default with no success.
> > >> >>
> > >> >> And I don't want to make specific @Qualifier annotation,
> > > because this
> > >> > is
> > >> >> unnecessary in my case and will cause errors in those cases when
> > > I
> > >> forget
> > >> >> to provide that @Qualifier at injection point.
> > >> >>
> > >> >> If anyone could help me with setting up a correct way to provide
> > >> default
> > >> >> producer, would be great.
> > >> >>
> > >> >> thanks and kind regards
> > >> >> Reinis
> > >> >>
> > >> >
> > >>
> > >
> >
> >
> >
> >
> >
>
Re: Re[2]: [OWB] CDI - how to realize default producer?
Posted by Romain Manni-Bucau <rm...@gmail.com>.
by default your bean will be a managed bean so injectable, just add
anything to prevent it (constructor without @Inject for instance) and
you'll remove the conflict.
veto = remove it from cdi (= handled manually)
Typed() = keep it in cdi but for Object type only (as all beans)
@Any ~= i don't care about details just give me it!
@Default = just because in cdi identity is type + qualifier so we need a
default one ;)
*Romain Manni-Bucau*
*Twitter: @rmannibucau <https://twitter.com/rmannibucau>*
*Blog: **http://rmannibucau.wordpress.com/*<http://rmannibucau.wordpress.com/>
*LinkedIn: **http://fr.linkedin.com/in/rmannibucau*
*Github: https://github.com/rmannibucau*
2013/5/19 <to...@orbit-x.de>
> Thank you guys for the excellent info!
>
> Now that i know what to search for, theres actually some discussion going
> on over this subject in internet.
>
> Although it works for me, i have the feeling that both solutions (@Typed
> and @Veto) are rather workarounds (i saw on stacktrace one more suggestion
> to annotate the bean to be produced with @Alternative without enabling it)
> because the intent of those annotations is different(?)
>
> Just for the sake of completeness, why would @Default or @New or @Any
> together with @Produces on producer method will not work?
>
> Br
> Reinis
>
>
> -----Ursprüngliche Nachricht-----
> Betreff: Re: [OWB] CDI - how to realize default producer?
> Von: "Mark Struberg" <st...@yahoo.de>
> An: users@tomee.apache.org
> Datum: 2013/05/19 14:40:52
>
> Yes, it's kind of different to ProcessAnnotatedType#veto(), but it has the
> same effect - your class and your producer don't clash anymore ;)
>
> And it comes without any expenses straight out of CDI-1.0
>
> LieGrue,
> strub
>
>
>
>
> ----- Original Message -----
> > From: John D. Ament <jo...@gmail.com>
> > To: users@tomee.apache.org; Mark Struberg <st...@yahoo.de>
> > Cc:
> > Sent: Sunday, 19 May 2013, 14:14
> > Subject: Re: [OWB] CDI - how to realize default producer?
> >
> > Well, I think @Typed is another work around. It doesn't remove the
> object
> > from the archive simply says you can't reference it by anything but
> > what's
> > in @Typed.
> >
> >
> > On Sun, May 19, 2013 at 6:19 AM, Mark Struberg <st...@yahoo.de>
> wrote:
> >
> >> CDI-1.0 _has_ a concept of vetoing. Simply annotate Foo with
> >>
> >> @Typed()
> >>
> >> LieGrue,
> >> strub
> >>
> >>
> >>
> >>
> >> ----- Original Message -----
> >> > From: John D. Ament <jo...@gmail.com>
> >> > To: users@tomee.apache.org
> >> > Cc:
> >> > Sent: Sunday, 19 May 2013, 4:37
> >> > Subject: Re: [OWB] CDI - how to realize default producer?
> >> >
> >> >T he easiest way is to actually put a qualifier on the class itself,
> > and
> >> > then never inject based on that qualifier. CDI 1.0 has no concept of
> > a
> >> > veto'd bean, but you could write an extension yourself that
> > veto'd your
> >> > class.
> >> >
> >> > Extensions exist out there, I believe CODI has one and Seam3 has one.
> >> > Seam3 uses @Veto to mark these beans as veto'd.
> >> >
> >> >
> >> > On Sat, May 18, 2013 at 6:48 PM, Reinis Vicups
> > <to...@orbit-x.de> wrote:
> >> >
> >> >> Hi,
> >> >>
> >> >> I'd like to use a producer method in ALL CASES when
> > @Injecting a
> >> >> particular bean.
> >> >>
> >> >> It looks like this:
> >> >>
> >> >> public class FooProducer {
> >> >>
> >> >> @Produces
> >> >> public Foo produceFoo() {
> >> >> Foo foo = new Foo();
> >> >> return foo;
> >> >> }
> >> >> }
> >> >>
> >> >> public class Foo {}
> >> >>
> >> >> With this example I get:
> >> >>
> >> >> SEVERE - CDI Beans module deployment failed
> >> >> javax.enterprise.inject.**AmbiguousResolutionException: Ambiguous
> >> >> resolution
> >> >> found beans:
> >> >> Foo, Name:null, WebBeans Type:MANAGED, API
> >> > Types:[....Foo,java.lang.**Object],
> >> >> Qualifiers:[javax.enterprise.**inject.Any,javax.enterprise.**
> >> >> inject.Default]
> >> >> Foo, Name:null, WebBeans Type:PRODUCERMETHOD, API
> >> Types:[....Foo,java.lang.
> >> >> **Object],
> >> Qualifiers:[javax.enterprise.**inject.Any,javax.enterprise.**
> >> >> inject.Default]
> >> >>
> >> >> I tried applying @Default with no success.
> >> >>
> >> >> And I don't want to make specific @Qualifier annotation,
> > because this
> >> > is
> >> >> unnecessary in my case and will cause errors in those cases when
> > I
> >> forget
> >> >> to provide that @Qualifier at injection point.
> >> >>
> >> >> If anyone could help me with setting up a correct way to provide
> >> default
> >> >> producer, would be great.
> >> >>
> >> >> thanks and kind regards
> >> >> Reinis
> >> >>
> >> >
> >>
> >
>
>
>
>
>