@Resource
private int maxLineItems;
Using EnvEntries
La anotación @Resource
se puede usar para inyectar varias cosas,
incluyendo fuentes de datos, temas, colas, etc. La mayoría
objetos suministrados por el contenedor.
Sin embargo, es posible proporcionar sus propios valores para inyectarlos mediante una etiqueta
<env-entry>
en su descriptor de implementación ejb-jar.xml
o` web.xml`.
Los tipos <env-entry>
compatibles con Java EE 6 están limitados a los siguientes:
-
java.lang.String
-
java.lang.Integer
-
java.lang.Short
-
java.lang.Float
-
java.lang.Double
-
java.lang.Byte
-
java.lang.Character
-
java.lang.Boolean
-
java.lang.Class
-
java.lang.Enum (any enum)
Consulte también el ejemplo Custom Injection para una
funcionalidad de TomEE y OpenEJB que le permitirá usar más que solo los anteriores
tipos, así como declarar elementos <env-entry>
con un archivo de propiedades.
Usando @Resource para propiedades básicas
El uso de la anotación @Resource
no se limita a los metodos establecedores (setters). Por
ejemplo, esta anotación podría haberse utilizado en el correspondiente campo así:
Un ejemplo más completo podría verse así:
package org.superbiz.injection.enventry;
import javax.annotation.Resource;
import javax.ejb.Singleton;
import java.util.Date;
@Singleton
public class Configuration {
@Resource
private String color;
@Resource
private Shape shape;
@Resource
private Class strategy;
@Resource(name = "date")
private long date;
public String getColor() {
return color;
}
public Shape getShape() {
return shape;
}
public Class getStrategy() {
return strategy;
}
public Date getDate() {
return new Date(date);
}
}
Aquí tenemos un bean @Singleton
llamado Configuration
que tiene la
siguientes propiedades (elementos <env-entry>
)
-
String color
-
Shape shape
-
Class strategy
-
long date
Suministro de valores de @Resource para elementos en ejb-jar.xml
Los valores de nuestras propiedades de color, forma, estrategia y fecha
se suministran a través de elementos <env-entry>
en el archivo ejb-jar.xml
o
Archivo web.xml
así:
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" version="3.0" metadata-complete="false">
<enterprise-beans>
<session>
<ejb-name>Configuration</ejb-name>
<env-entry>
<env-entry-name>org.superbiz.injection.enventry.Configuration/color</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>orange</env-entry-value>
</env-entry>
<env-entry>
<env-entry-name>org.superbiz.injection.enventry.Configuration/shape</env-entry-name>
<env-entry-type>org.superbiz.injection.enventry.Shape</env-entry-type>
<env-entry-value>TRIANGLE</env-entry-value>
</env-entry>
<env-entry>
<env-entry-name>org.superbiz.injection.enventry.Configuration/strategy</env-entry-name>
<env-entry-type>java.lang.Class</env-entry-type>
<env-entry-value>org.superbiz.injection.enventry.Widget</env-entry-value>
</env-entry>
<env-entry>
<description>The name was explicitly set in the annotation so the classname prefix isn't required</description>
<env-entry-name>date</env-entry-name>
<env-entry-type>java.lang.Long</env-entry-type>
<env-entry-value>123456789</env-entry-value>
</env-entry>
</session>
</enterprise-beans>
</ejb-jar>
Usando el atributo @Resource name
Tenga en cuenta que date
fue referenciada por nombre
como:
@Resource(name = "date")
private long date;
Cuando se utiliza el @Resource(name)
, no es necesario especificar el
nombre de clase del bean y puede hacerlo brevemente así:
<env-entry>
<description>The name was explicitly set in the annotation so the classname prefix is not required</description>
<env-entry-name>date</env-entry-name>
<env-entry-type>java.lang.Long</env-entry-type>
<env-entry-value>123456789</env-entry-value>
</env-entry>
Por el contrario, color
no fue referenciado por nombre
@Resource
private String color;
Cuando algo no está referenciado por nombre
en la anotación @Resource
se crea un nombre predeterminado. El formato es esencialmente este:
bean.getClass() + "/" + field.getName()
Entonces, el nombre
predeterminado de la propiedad color
anterior termina siendo
org.superbiz.injection.enventry.Configuration/color
. Este es el nombre que
debemos usar cuando intentamos decalre un valor para él en xml.
<env-entry>
<env-entry-name>org.superbiz.injection.enventry.Configuration/color</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>orange</env-entry-value>
</env-entry>
@Resource y Enum (enumeraciones)
El campo shape
es en realidad un tipo Java Enum personalizado
package org.superbiz.injection.enventry;
public enum Shape {
CIRCLE,
TRIANGLE,
SQUARE
}
A partir de Java EE 6, los tipos java.lang.Enum están permitidos como elementos <env-entry>
.
La declaración de uno en xml se realiza utilizando el nombre de clase de la enumeración real
al igual que:
<env-entry>
<env-entry-name>org.superbiz.injection.enventry.Configuration/shape</env-entry-name>
<env-entry-type>org.superbiz.injection.enventry.Shape</env-entry-type>
<env-entry-value>TRIANGLE</env-entry-value>
</env-entry>
¡No use <env-entry-type> java.lang.Enum </env-entry-type>
o no funcionará!
ConfigurationTest
package org.superbiz.injection.enventry;
import junit.framework.TestCase;
import javax.ejb.embeddable.EJBContainer;
import javax.naming.Context;
import java.util.Date;
public class ConfigurationTest extends TestCase {
public void test() throws Exception {
final Context context = EJBContainer.createEJBContainer().getContext();
final Configuration configuration = (Configuration) context.lookup("java:global/injection-of-env-entry/Configuration");
assertEquals("orange", configuration.getColor());
assertEquals(Shape.TRIANGLE, configuration.getShape());
assertEquals(Widget.class, configuration.getStrategy());
assertEquals(new Date(123456789), configuration.getDate());
}
}
Ejecución
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running org.superbiz.injection.enventry.ConfigurationTest
Apache OpenEJB 4.0.0-beta-1 build: 20111002-04:06
http://tomee.apache.org/
INFO - openejb.home = /Users/dblevins/examples/injection-of-env-entry
INFO - openejb.base = /Users/dblevins/examples/injection-of-env-entry
INFO - Using 'javax.ejb.embeddable.EJBContainer=true'
INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service)
INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager)
INFO - Found EjbModule in classpath: /Users/dblevins/examples/injection-of-env-entry/target/classes
INFO - Beginning load: /Users/dblevins/examples/injection-of-env-entry/target/classes
INFO - Configuring enterprise application: /Users/dblevins/examples/injection-of-env-entry
WARN - Method 'lookup' is not available for 'javax.annotation.Resource'. Probably using an older Runtime.
INFO - Configuring Service(id=Default Singleton Container, type=Container, provider-id=Default Singleton Container)
INFO - Auto-creating a container for bean Configuration: Container(type=SINGLETON, id=Default Singleton Container)
INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
INFO - Auto-creating a container for bean org.superbiz.injection.enventry.ConfigurationTest: Container(type=MANAGED, id=Default Managed Container)
INFO - Enterprise application "/Users/dblevins/examples/injection-of-env-entry" loaded.
INFO - Assembling app: /Users/dblevins/examples/injection-of-env-entry
INFO - Jndi(name="java:global/injection-of-env-entry/Configuration!org.superbiz.injection.enventry.Configuration")
INFO - Jndi(name="java:global/injection-of-env-entry/Configuration")
INFO - Jndi(name="java:global/EjbModule1355224018/org.superbiz.injection.enventry.ConfigurationTest!org.superbiz.injection.enventry.ConfigurationTest")
INFO - Jndi(name="java:global/EjbModule1355224018/org.superbiz.injection.enventry.ConfigurationTest")
INFO - Created Ejb(deployment-id=org.superbiz.injection.enventry.ConfigurationTest, ejb-name=org.superbiz.injection.enventry.ConfigurationTest, container=Default Managed Container)
INFO - Created Ejb(deployment-id=Configuration, ejb-name=Configuration, container=Default Singleton Container)
INFO - Started Ejb(deployment-id=org.superbiz.injection.enventry.ConfigurationTest, ejb-name=org.superbiz.injection.enventry.ConfigurationTest, container=Default Managed Container)
INFO - Started Ejb(deployment-id=Configuration, ejb-name=Configuration, container=Default Singleton Container)
INFO - Deployed Application(path=/Users/dblevins/examples/injection-of-env-entry)
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.664 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0