blob: c0b8e8c9781f7735c516c44e8ebc351051f64a06 [file] [log] [blame]
= CDI @RequestScoped
:index-group: CDI
:jbake-type: page
:jbake-status: published
Este exemplo mostra o uso da anotação `@RequestScoped` para objetos injetados. Um objeto que é
definido como `@RequestScoped` é criado uma vez para cada requisição e é compartilhado por todos os
beans que o injetam através do mesmo request.
== Exemplo
Este exemplo retrata um cenário similar ao cdi-application-scope. O visitante de um restaurante
pede uma sopa ao garçom. O pedido é passado para o chefe que prepara o prato e o devolve ao garçom
que entrega para o visitante.
=== Waiter (garçom)
O `Waiter` session bean recebe uma requisição através do método `orderSoup()` da classe de teste.
Uma instância de `Soup` será criada nesse método e ela será compartilhada em toda a requisição com o
bean `Chef`. O método passa o request para o bean `Chef`. Ele então retorna o nome da sopa para a
classe de teste.
[source,java]
----
@Stateless
public class Waiter {
@Inject
private Soup soup;
@EJB
private Chef chef;
public String orderSoup(String name){
soup.setName(name);
return chef.prepareSoup().getName();
}
}
----
=== Soup (sopa)
A classe `Soup` é um POJO injetável, definida como `@RequestScoped`. Isso significa que uma instância
será criada apenas uma vez para cada request e será compartilhada por todos os beans que a injetam.
[source,java]
----
@RequestScoped
public class Soup {
private String name = "Soup of the day";
@PostConstruct
public void afterCreate() {
System.out.println("Soup created");
}
public String getName() {
return name;
}
public void setName(String name){
this.name = name;
}
}
----
=== Chef
A classe `Chef` é um simples session bean com um campo `Soup` injetado. Normalmente, o parâmetro soup
seria passado para o `prepareSoup()` como argumento, mas para as necessidades deste exemplo será
passado pelo contexto da requisição.
[source,java]
----
@Stateless
public class Chef {
@Inject
private Soup soup;
public Soup prepareSoup() {
return soup;
}
}
----
== Caso de teste
Esta é a classe de entrada para este exemplo.
[source,java]
----
public class RestaurantTest {
private static String TOMATO_SOUP = "Tomato Soup";
private EJBContainer container;
@EJB
private Waiter joe;
@Before
public void startContainer() throws Exception {
container = EJBContainer.createEJBContainer();
container.getContext().bind("inject", this);
}
@Test
public void orderSoup(){
String soup = joe.orderSoup(TOMATO_SOUP);
assertEquals(TOMATO_SOUP, soup);
soup = joe.orderSoup(POTATO_SOUP);
assertEquals(POTATO_SOUP, soup);
}
@After
public void closeContainer() throws Exception {
container.close();
}
}
----
== Executando
Na saida você pode ver que existem duas instâncias de `Soup` criadas - uma para cada requisição.
[source,console]
----
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running org.superbiz.cdi.requestscope.RestaurantTest
Apache OpenEJB 7.0.0-SNAPSHOT build: 20111224-11:09
http://tomee.apache.org/
INFO - openejb.home = C:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope
INFO - openejb.base = C:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope
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: c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope\target\classes
INFO - Beginning load: c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope\target\classes
INFO - Configuring enterprise application: c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope
INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
INFO - Auto-creating a container for bean cdi-request-scope.Comp: Container(type=MANAGED, id=Default Managed Container)
INFO - Configuring Service(id=Default Stateless Container, type=Container, provider-id=Default Stateless Container)
INFO - Auto-creating a container for bean Chef: Container(type=STATELESS, id=Default Stateless Container)
INFO - Enterprise application "c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope" loaded.
INFO - Assembling app: c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope
INFO - Jndi(name="java:global/cdi-request-scope/Chef!org.superbiz.cdi.requestscope.Chef")
INFO - Jndi(name="java:global/cdi-request-scope/Chef")
INFO - Jndi(name="java:global/cdi-request-scope/Waiter!org.superbiz.cdi.requestscope.Waiter")
INFO - Jndi(name="java:global/cdi-request-scope/Waiter")
INFO - Created Ejb(deployment-id=Chef, ejb-name=Chef, container=Default Stateless Container)
INFO - Created Ejb(deployment-id=Waiter, ejb-name=Waiter, container=Default Stateless Container)
INFO - Started Ejb(deployment-id=Chef, ejb-name=Chef, container=Default Stateless Container)
INFO - Started Ejb(deployment-id=Waiter, ejb-name=Waiter, container=Default Stateless Container)
INFO - Deployed Application(path=c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope)
Soup created
Soup created
INFO - Undeploying app: c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.412 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
----