For field or setter injections, any string constants can be declared in the enclosing class. The following example shows how to declare an env-entry in web.xml and inject it to a servlet class.
public static final String ADMIN_EMAIL = "adminEmail";
@Resource(name=ADMIN_EMAIL)
private String adminEmail;
The name attribute is mandatory and used to match this injection to the appropriate env-entry in web.xml. This env-entry can be injected into several other classes, and therefore it is desirable to declare its name as a constant. This string constant may also reside in a separate class (e.g., a Constants class, utility class, or even some interface), depending on how it is used.
<env-entry>
<description>admin email</description>
<env-entry-name>adminEmail</env-entry-name>
<env-entry-value>admin@example.x</env-entry-value>
</env-entry>
For type-level injections, these string constants must be declared in a separate class in order to be referenced in type-level annotations. This is probably because any field declarations have not be parsed when type-level annotations in the same class are processed. The follwoing example shows how to inject a stateful EJB reference at a servlet class level.
import static test.Constants.FOO_EJB_NAME;In the above injection,
import static test.Constants.FOO_EJB_REF_NAME;
@EJB(name=FOO_EJB_REF_NAME, beanName=FOO_EJB_NAME, beanInterface=FooBean.class)
public class Servlet2 extends HttpServlet {...}
beanName
is optional only if there is only one EJB with business interface FooBean
, and hence no ambiguity in mapping the EJB reference to target EJB. name
and beanInterface
attributes are always required when the @EJB
injection is used at type level.