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