23
Globalcode – Open4Education EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Embed Size (px)

Citation preview

Page 1: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education1

EJB3 Interceptors

Ricardo Limonta

Page 2: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education2

Agenda

• Introdução• Conceitos de AOP• Implementando Interceptors• Exemplos• Melhores Práticas• Novidades na versão 3.1• Perguntas & Comentários

Page 3: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education3

Palestrante

Ricardo LimontaRicardo Limonta

Arquiteto JEE / Instrutor Java VOfficeArquiteto JEE / Instrutor Java VOffice

12 anos na área de sistemas, atuando em projetos 12 anos na área de sistemas, atuando em projetos nacionais e offshore, médio e grande portes;nacionais e offshore, médio e grande portes;

Certificações: Certificações: SCJP 5 / SCEA.SCJP 5 / SCEA.

Hobby Favorito: Hobby Favorito: SurfSurf

Page 4: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education4

Introdução

• Recurso introduzido na versão EJB 3.0;

• Utiliza o recurso AOP (Aspect-oriented programming).

• Permite a criação de métodos que interceptam a chamada a métodos de negócio e eventos de ciclo de vida dos beans;

• Podem ser configurados em beans de sessão e beans baseados em mensagens.

Page 5: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education5

Conceitos de AOP

Aspect-Orientation Programming: É um paradigma de programação que permite uma separação de código orientada à importância (separation of concerns).

Conceito criado por Gregor Kiczales e sua equipe da Xerox.

O Intuito principal na utilização de AOP é separar claramente a responsabilidade dos objetos e diminuir massivamente a quantidade de funcionalidades secundárias repetitivas.

Page 6: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education6

Conceitos de AOP

PedidoBean

pedido: Pedido

Insert()update()delete()log()

Pedido

numero: Stringdata: Datevalor: Double

Page 7: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education7

Conceitos de AOP

PedidoBean

pedido: Pedido

Insert()update()delete()

Pedido

numero: Stringdata: Datevalor: Double

Logger

log()

Page 8: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education8

Conceitos de AOP

PedidoBean

pedido: Pedido

Insert()update()delete()

Logger

log()

Combinação

Page 9: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education9

Conceitos de AOP

Cenário:

1. Um componente deve ser capaz de incluir pedidos;

2. Deve existir uma aprovação sobre o valor do pedido em relação ao perfil do usuário logado no sistema;

3. Deve existir um log de transação, as informações de usuário, ação executada e tempo de execução devem ser gravados;

Page 10: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education10

Conceitos de AOP public Pedido insert(Pedido pedido) throws BusinessException { long startTime = System.currentTimeMillis(); try{ //verifica se o usuário tem perfil para aprovação de pedidos. if ((pedido.getValor() > 10000.0d) && (! principal.getName().equals("supervisor"))){ throw new BusinessException("O usuário não tem permissão ..."); }

//implementa as regras de negócio… save(pedido);

} catch (Exception e) { throw new BusinessException(e); } finally { long endTime = System.currentTimeMillis() - startTime; System.out.println("insert() - " + endTime + " - " + principal.getName()); } return pedido; }

Page 11: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education11

Conceitos de AOP

@Interceptors(LogInterceptor.class) public Pedido insert(Pedido pedido) throws BusinessException {

//verifica se o usuário tem perfil para aprovação de pedidos. if ((pedido.getValor() > 10000.0d) && (! principal.getName().equals("supervisor"))){ throw new BusinessException("O usuário não tem permissão ..."); }

//implementa as regras de negócio… save(pedido);

return pedido; }

Page 12: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education12

Conceitos de AOP

@Interceptors(values={LogInterceptor.class, PedidoAlcadaInterceptor.class}) public Pedido insert(Pedido pedido) throws BusinessException {

//implementa as regras de negócio… save(pedido);

return pedido; }

Page 13: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education13

Interceptors

• São objetos capazes de interceptar chamadas a métodos de negócio ou eventos de ciclo de vida dos beans;

• “Rodam” na mesma pilha de processamento do bean, no mesmo contexto de transação e segurança, do método requisitado.

• Acesso a todos recursos do container JEE (@…);

• Funcionam como uma extensão do EJB.

Page 14: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education14

Interceptors

@AroundInvoke public Object <Name>(InvocationContext invocation) throws Exception {

… }

Interceptador para de métodos de negócio…

Page 15: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education15

Interceptors

public class LogInterceptor { @AroundInvoke public Object logger(InvocationContext invocation) throws Exception { long startTime = System.currentTimeMillis(); try { return invocation.proceed(); } finally { long endTime = System.currentTimeMillis() - startTime; System.out.println("Method: " + invocation.getMethod().getName() + " - " + "Values: " + invocation.getParameters()[0] + " - " + "Time: " + endTime + " - " + "User: " + ctx.getCallerPrincipal().getName()); } }}

Exemplo: LogInterceptor.java

Page 16: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education16

Interceptors

@<Callback-Annotation> public void <Name>(InvocationContext invocation) {

… }

Interceptando eventos dos beans…

Exemplo:

@PostConstruct public void <Name>(InvocationContext invocation) {

… }

Page 17: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education17

Interceptors

InvocationContext: Contém as informações do objeto interceptado.

Principais métodos:

Método DescriçãoObject getTarget() Retorna a referência do EJBMethod getMethod() Retorna um objeto que faz

referência ao método invocado

Object[] getParameters() Lista de parâmetros do método

Map getContextData() Mapa de objetos que percorre todo o ciclo de invocação do método

Object proceed() Invoca o interceptor seguinte ou o método de negócio do bean

Page 18: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education18

Interceptors

Client PedidoBeanInsert(pedido)

Chamada a um bean sem interceptor…

Page 19: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education19

Combinação

Interceptors

Client PedidoBeanInterceptor A

Interceptor B

Interceptor C

Insert(pedido)

Chamada a um bean com interceptors…

Page 20: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education20

Exemplos

Show Demo…

Page 21: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education21

Melhores Práticas

- Procure sempre identificar necessidades genéricas que se faça necessário o uso de interceptors. Logs, Handlers, Validadores, etc.

- Crie interceptors com baixa complexidade;

- Documentação é tudo !

Page 22: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education22

Novidades

@Interceptors(LogInterceptor.class) public @Interface Auditoria{}

@Auditoria public void delete(Long idPedido) {

… }

Definir sua própria anotação de interceptors…

Forma de uso:

Page 23: Globalcode – Open4Education 1 EJB3 Interceptors Ricardo Limonta

Globalcode – Open4Education23

Perguntas & Comentários

?