| :index-group: Environment Entries |
| :jbake-type: page |
| :jbake-status: status=published |
| = 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 link:../custom-injection[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í: |
| |
| [source,java] |
| ---- |
| @Resource |
| private int maxLineItems; |
| ---- |
| |
| Un ejemplo más completo podría verse así: |
| |
| [source,java] |
| ---- |
| 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í: |
| |
| [source,xml] |
| ---- |
| <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: |
| |
| [source,java] |
| ---- |
| @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í: |
| |
| [source,java] |
| ---- |
| <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` |
| |
| [source,java] |
| ---- |
| @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: |
| |
| [source,java] |
| ---- |
| 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. |
| |
| [source,java] |
| ---- |
| <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 |
| |
| [source,java] |
| ---- |
| 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: |
| |
| [source,java] |
| ---- |
| <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 |
| |
| [source,java] |
| ---- |
| 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 |
| |
| [source,console] |
| ---- |
| ------------------------------------------------------- |
| 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 |
| ---- |