Decorator do CDI não está "decorando" meu objeto

2 respostas
maior_abandonado

Boa tarde a todos, antes de tudo agradeço em quem me ajudar.

estou estudando CDI a partir deste tutorial: http://blog.gilliard.eti.br/2010/05/aplicacao-desktop-com-weld-parte-2/

eu estou tentando fazer funcionar o Decorator do CDI, a minha classe decorator herda a classe que quero que ela decore, essa classe à ser decorada é injetada em outra e o decorator é declarado no beans.xml... nenhum erro acontece porém o método executado não é o da classe decoradora, mas sim o da que deveria ser decorada...

Em resumo peço que alguém me ajude a visualizar onde estou errando, códigos:

beans.xml:

<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
 	
 	
	<interceptors>
		<class>pacote.cdi.bo.interceptors.implementation.SeguroInterceptor</class>
	</interceptors>
 	
 	<decorators>
 		<class>pacote.cdi.bo.decorator.CaixaDecorator</class>
 	</decorators>
 	
 	
</beans>

classe à ser decorada:

package pacote.cdi.bo;

import java.io.Serializable;

import javax.enterprise.event.Event;
import javax.inject.Inject;

import pacote.cdi.vo.Movimentacao;

public class CaixaEletronico implements Serializable {
	
	@Inject private Event<Movimentacao> eventMovimentacao;
	
	public void depositar(float valor) {
		
        eventMovimentacao.fire(new Movimentacao(valor));
    }
	
    public void sacar(float valor) {
        eventMovimentacao.fire(new Movimentacao(-1 * valor));
    }
    
}

classe decorator:

package pacote.cdi.bo.decorator;

import java.io.Serializable;

import javax.decorator.Decorator;
import javax.decorator.Delegate;
import javax.inject.Inject;

import pacote.cdi.bo.CaixaEletronico;
 
@Decorator
public class CaixaDecorator extends CaixaEletronico implements Serializable  {
 
	@Inject
	@Delegate
	private CaixaEletronico delegate;
 
	@Override
	public void sacar(float valor) {
 
		System.out.println("CaixaDecorator.sacar()");
 
		delegate.sacar(valor);
	}
 
	@Override
	public void depositar(float valor) {
 
		System.out.println("CaixaDecorator.depositar()");
 
		delegate.depositar(valor);
	}
}

outras relevantes:

package pacote.cdi.main;

import org.jboss.weld.environment.se.StartMain;

public class Main {
	
	public static void main(String[] args) {
		long inicio = System.currentTimeMillis();
		System.out.println(inicio);
		StartMain.main(args);
		long fim = System.currentTimeMillis();
		System.out.println(fim);
		System.out.println("diferença:"+ (fim-inicio));
	}
	
	
	
}
package pacote.cdi.main;

import javax.enterprise.event.Observes;
import javax.inject.Inject;

import org.jboss.weld.environment.se.events.ContainerInitialized;

import pacote.cdi.bo.CaixaEletronico;
import pacote.cdi.bo.ContaBancaria;

public class Core {

	@Inject private CaixaEletronico caixaEletronico;
	@Inject private ContaBancaria contaBancaria;
	
	public void containerInitialized (@Observes ContainerInitialized initEvent){
		System.out.println("container inicializado");
		
        caixaEletronico.sacar(200.0f);
        
        System.out.println(contaBancaria.getSaldo());
        
        caixaEletronico.depositar(300.0f);
        
        System.out.println(contaBancaria.getSaldo());
		
	}
	
}

novamente, grato.

editando, eu tinha deixando as classes sem implementar Serializable, googlando vi gente dizendo que resolveu problema fazendo isso mas não resolveu, também estava invertida a ordem que declarei no beans.xml entre o decorator e o interceptor mas invertendo não deu diferença...

2 Respostas

maior_abandonado

a sim, estou usando o weld como implementação de CDI.

maior_abandonado

ninguém?

Criado 26 de abril de 2012
Ultima resposta 27 de abr. de 2012
Respostas 2
Participantes 1