Preloader image

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í:

@Resource
private int maxLineItems;

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