Preloader image

A anotação @Resource pode ser usada para injetar várias coisas, incluindo fontes de dados, tópicos, filas etc. A maioria delas são objetos fornecidos por contêiner.

É possível, no entanto, fornecer seus próprios valores para serem injetados através de um <env-entry> no seu descritor de implementação ejb-jar.xml ou web.xml. Os tipos <env-entry> suportados pelo Java EE 6 são limitados ao seguinte:

  • 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 também o Injeção personalizada exemplo para um recurso TomEE e OpenEJB permitem que você use mais do que apenas os tipos acima, além de declarar itens <env-entry> com um arquivo de propriedades simples.

Usando @Resource para propriedades básicas

O uso da anotação @Resource não se limita aos setters. Por exemplo, esta anotação poderia ter sido usada no correspondente campo assim:

@Resource
private int maxLineItems;

Um exemplo mais completo pode ser assim:

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);
    }
}

Aqui temos um bean @Singleton chamado Configuration que possui as seguintes propriedades (itens `<env-entry> `)

  • String color

  • Shape shape

  • Class strategy

  • long date

Fornecendo valores @Resource para itens em ejb-jar.xml

Os valores para nossas propriedades color,shape, strategy e date são fornecidos através dos elementos <env-entry> no arquivo ejb-jar.xml ou no arquivo arquivo web.xml da seguinte forma:

<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 o atributo @Resource `name'

Note que date foi referenciado por name como:

@Resource(name = "date")
private long date;

Quando o @Resource (name) é usado, você não precisa especificar o nome completo da classe do bean e pode fazê-lo brevemente da seguinte maneira:

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

Por outro lado, color não foi referenciado por name

@Resource
private String color;

Quando algo não é referenciado por name na anotação @Resource, um nome padrão é criado. O formato é essencialmente este:

bean.getClass() + "/" + field.getName()

Portanto, o name padrão da propriedade color acima acaba sendo org.superbiz.injection.enventry.Configuration/color. Esse é o nome devemos usar quando tentamos decalcar um valor para ele em 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 e Enum (enumerações)

O campo shape é realmente um tipo Java Enum personalizado

package org.superbiz.injection.enventry;

public enum Shape {

    CIRCLE,
    TRIANGLE,
    SQUARE
}

No Java EE 6, os tipos java.lang.Enum são permitidos como <ententent> Itens. A declaração de um em xml é feita usando o nome da classe da enumeração real:

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

Não use <env-entry-type>java.lang.Enum</env-entry-type> ou não 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());
    }
}

Executando

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