[RESOLVIDO] ComponentFactory injetando instancias diferentes no controller e no interceptor

Tenho um cenário simples: Uma DaoFactoryFactory que cria DaoFactories pelos mecanismos do Guice. Quero interceptar esta DaoFactory criada para tratamento das transactions.

Porem, numa mesma request, ele cria incorretamente duas instancias: Uma interceptada e outra injetada no Controller.

Como resolver isso? Preciso que seja criada apenas UMA instancia do ComponentFactory que sera interceptada… O q fiz errado?

Valeu!

public interface DaoFactoryFactory {
	DaoFactory create();
}

public interface DaoFactory {
	void beginTransaction();

	void commit();

	void rollback();

	void close();
}

@Component
@ApplicationScoped
public class DaoFactoryCreator implements ComponentFactory<DaoFactory> {

	private DaoFactoryFactory daoFactoryFactory;

	@PostConstruct
	public void create() {
		daoFactoryFactory = Guice.createInjector(new DaoModule()).getInstance(
				DaoFactoryFactory.class);
	}

	@Override
	public DaoFactory getInstance() {
		return daoFactoryFactory.create();
	}

}

@Intercepts
@RequestScoped
public class DaoFactoryInterceptor implements Interceptor {
	private final Logger logger = LoggerFactory.getLogger(getClass());

	private final DaoFactory daoFactory;

	public DaoFactoryInterceptor(DaoFactory daoFactory) {
		this.daoFactory = daoFactory;
	}

	@Override
	public void intercept(InterceptorStack stack, ResourceMethod method,
			Object resourceInstance) throws InterceptionException {
		logger.info("Instancia: {}", daoFactory);
		try {
			daoFactory.beginTransaction();
			stack.next(method, resourceInstance);
			daoFactory.commit();
		} finally {
			daoFactory.close();
		}
	}

	@Override
	public boolean accepts(ResourceMethod method) {
		return true;
	}

}

@Resource
public class UraConectorController {
	private final Logger logger = LoggerFactory.getLogger(getClass());
	@Path("/")
	public void index() {
		logger.info("Instancia: {}", daoFactory);
	}
}

E o resultado:

12/11/11 14:40:03 [http-bio-8080-exec-3]  INFO interceptors.DaoFactoryInterceptor:28 - Instancia: net.danieljurado.ctimanager.uraconector.dao.impl.DaoFactoryImpl@73f17a73
12/11/11 14:40:03 [http-bio-8080-exec-3]  INFO controllers.UraConectorController:82 - instancia: net.danieljurado.ctimanager.uraconector.dao.impl.DaoFactoryImpl@5f996bbd

Idiotice minha… O DaoFactoryCreator deve criar apenas umas instancia e entregar a mesma. Resolvido o problema…

@Component
@RequestScoped
public class DaoFactoryCreator implements ComponentFactory<DaoFactory> {

	private final DaoFactoryFactory daoFactoryFactory;
	private DaoFactory daoFactory;

	public DaoFactoryCreator(DaoFactoryFactory daoFactoryFactory) {
		this.daoFactoryFactory = daoFactoryFactory;
	}

	@PostConstruct
	public void create() {
		daoFactory = daoFactoryFactory.create();
	}

	@Override
	public DaoFactory getInstance() {
		return daoFactory;
	}

	@PreDestroy
	public void close() {
		daoFactory.close();
	}

}