Both the CDI 1.0 and 1.1 draft include this comment about Nonbinding:
Array-valued or annotation-valued members of a qualifier type should be annotated @Nonbinding in a portable application.
If an array-valued or annotation-valued member of a qualifier type is not annotated @Nonbinding , non-portable behavior
results.
What is the non-portable behavior one might see with annotation-valued qualifiers without @Nonbinding?
I'm finding the usage of qualifiers with annotation member values difficult to deal with when using @Nonbinding as I posted in a previous thread. The canonical usecase of the HttpParam from "Chapter 4. Dependency injection and programmatic lookup" of the Weld docs I would argue should be written like this:
@BindingType @Retention(RUNTIME) @Target({TYPE, METHOD, FIELD, PARAMETER}) public @interface HttpParam { public String value(); } class HttpParams @Produces @Nonbinding @HttpParam("") String getParamValue(InjectionPoint ip) { ServletRequest request = (ServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); return request.getParameter(ip.getAnnotated().getAnnotation(HttpParam.class).value()); } }
So that only the producer method has the @Nonbinding annotation. This would allow an HttpParam user to differentiate both field injection as well as string events:
class SomeHttpParamUser { @HttpParam("username") String username; @HttpParam("password") String password; public void setUsername(@Observes @HttpParam("username") String username) {...} public void setPassword(@Observes @HttpParam("password") String username) {...} }
Right now to get the same behavior one has to use an HttpParamNonbinding annotation that would include the @Nonbinding on the value on the fields and another HttpParam without the @Nonbinding on the event observer methods.
Non-portable behavior for array-valued and annotation-valued members is likely to be removed in CDI 1.1, see CDI-234.
BTW @Nonbinding can only be used to exclude a member of an annotation type.