FAQ created. Feel free to revise or clarify. I'm sure this page will get a lot of attention because it's an important aspect of how CDI functions.

http://www.seamframework.org/Documentation/HowDoAResolveAnAmbiguousResolutionExceptionBetweenAProducerMethodAndARawType

-Dan

On Thu, Jul 23, 2009 at 7:45 AM, Pete Muir <pmuir@redhat.com> wrote:
Probably a good FAQ http://www.seamframework.org/Documentation/WebBeans

On 22 Jul 2009, at 15:05, Dan Allen wrote:

Okay, so there is an explicit step that must be taken for a producer method to win over a @Current bean (does not have additional bindings) of that type. I suspect in most cases developers will choose to use the binding type since that is the type-safe approach.

The designation of the alternative class in beans.xml makes all producer methods in that class have a higher precedence than any @Current bean of that type, correct? Is it also possible to specify a single method in beans.xml? There is alluded to in the Policy section, but no examples to support it.

Btw, I think this would be a lot clearer if it was explicitly stated in the spec how a producer method relates to a @Current bean of that type. I guess you could say it can be implied, but the first time someone goes to create a producer method, I can see them not realizing that they have to take an extra step to make it the preferred source.

-Dan

On Wed, Jul 22, 2009 at 7:13 AM, Pete Muir <pmuir@redhat.com> wrote:

On 22 Jul 2009, at 03:18, Dan Allen wrote:

After the recent revisions of the JSR-299 spec, I'm finding that I'm a tad confused about the bean selection algorithm when a producer method exists.

Consider the following:

class PotatoChip {
}

class SnackFactory() {
  public @Produces PotatoChip createPotatoChip() {
      return new PotatoChip();
  }
}

1) Does the produced PotatoChip take precedence over the raw dependent type when being selected for injection?

No.



2) How do I get the Bean<PotatoChip> that represents the producer method?

BeanManager#getBeans(PotatoChip.class) returns two beans that are indistinguishable from the public API.

either:

@Alternative

class SnackFactory() {
  public @Produces PotatoChip createPotatoChip() {
      return new PotatoChip();
  }
}

<beans>
 <alternatives>
    <alternative>SnackFactory</alternative>
 </alternatives>
</beans>

or

class SnackFactory() {
  public @Produces @Snack PotatoChip createPotatoChip() {
      return new PotatoChip();
  }
}

BeanManager.getBeans(PotatoChip.class, new AnnotationLiteral<Snack>() {});

where @Snack is a binding type



3) What if the producer method is @RequestScoped? How do I get the request-scoped produce instead of the dependent bean?

    Bean<PotatoChip> potatoChipBean = null;
    for (Bean<PotatoChip> candidate : getBeans(PotatoChip.class))
    {
       if (candidate.getScopeType().equals(RequestScoped.class))
       {
          potatoChipBean = candidate;
          break;
       }
    }

Sorry if this sounds like a dumb question. The spec has changed a lot and my memory is getting mixed in with the current set of facts.

As above.

It's possible the RI doesn't actually reflect this behavior atm - if you have a problem, make sure there is a test, then change the RI or file a WBRI.



--
Dan Allen
Senior Software Engineer, Red Hat | Author of Seam in Action
Registered Linux User #231597

http://mojavelinux.com
http://mojavelinux.com/seaminaction
http://in.relation.to/Bloggers/Dan
_______________________________________________
webbeans-dev mailing list
webbeans-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/webbeans-dev




--
Dan Allen
Senior Software Engineer, Red Hat | Author of Seam in Action
Registered Linux User #231597

http://mojavelinux.com
http://mojavelinux.com/seaminaction
http://in.relation.to/Bloggers/Dan