I am reading through the CDI
injections in JavaEE 7 particularly using @Qualifier
and @Produces
to inject a custom Data type
into a bean.
I have the following code taken from JBoss documentation towards ends of the page.
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface HttpParam {
@Nonbinding public String value();
}
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
class HttpParams {
@Produces @HttpParam("")
String getParamValue(InjectionPoint ip) {
ServletRequest request = (ServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
return request.getParameter(ip.getAnnotated().getAnnotation(HttpParam.class).value());
}
}
And this qualifier could be used in the following way:
@HttpParam("username") @Inject String username;
@HttpParam("password") @Inject String password;
My question is :
what does @Nonbinding
annotation mean? and why is it needed?
Should the method signature should always be like this @Nonbindng public String value();
. The reason I ask this is I have seen several different examples but they all have the same signature. That is the following allowed:
public @interface HttpParam { @Nonbinding public int value(); }
public @interface HttpParam { @Nonbinding public String value(); @Nonbinding public int value1(); }
Thanks
By default, qualifier arguments are considered for matching bean qualifiers to injection point qualifiers. A @Nonbinding
argument is not considered for matching.
In this case, the bean produced by the producer method has qualifier @HttpParam("")
. If the argument were binding (i.e. not @Nonbinding
), @HttpParam("")
would not match @HttpParam("username")
on the injection point.
You can have any number of qualifier arguments, binding or non-binding.
See Typesafe resolution in the CDI specification.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With