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.