Erro com Transaction do Spring no Vraptor

Bom dia pessoal,

Estou tentando integrar VRaptor e Spring seguuindo a apostila fj28 da caelum, mas to tendo umas dificuldades:

a classe Criador de Session ta assim:

@Component
@RequestScoped 
public class CriadorDeSession implements ComponentFactory<Session> {

    private final SessionFactory factory;
    private final Proxifier proxifier;
    private Session session;

    public CriadorDeSession(SessionFactory factory, Proxifier proxifier) {
        this.factory = factory;
        this.proxifier = proxifier;
    }

    @PostConstruct
    public void abre() {
        this.session = proxifier.proxify(Session.class, new MethodInvocation<Session>() {
            public Object intercept(Session proxy, Method method, Object[] args, SuperMethod superMethod) {
                Session sessionDoSpring = SessionFactoryUtils.doGetSession(factory, true);
                return new Mirror().on(sessionDoSpring).invoke().method(method).withArgs(args);
            }
        });
    }

    public Session getInstance() {
        return this.session;
    }

    @PreDestroy
    public void fecha() {
        this.session.close();
    }
}

a SessionFactory assim:

@ApplicationScoped
public class CriadorDeSessionFactory implements ComponentFactory<SessionFactory> {

    private SessionFactory factory;

    @PostConstruct
    public void abre() {
        AnnotationConfiguration configuration = new AnnotationConfiguration();
        configuration.configure();
        this.factory = configuration.buildSessionFactory();

    }

    public SessionFactory getInstance() {
        return factory;
    }

    @PreDestroy
    public void fecha() {
        this.factory.close();
    }
}

O applicationContext esta no path e conforme apostila
O meu DAO implementa a interface xxxDAO como explica a apostila aqui -> “Capítulo 16 - Apêndice - Integrando VRaptor e Spring - Exercícios: Transaction Manager - Página 162”
Estava tendo outros erros que acabei resolvendo, mas agora estou com esse e não sei o que pode ser!!

Esse erro aparece na hora de salvar (save) algum objeto

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: net.vidageek.mirror.exception.ReflectionProviderException: Could not invoke method save
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:93)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at com.googlecode.psiprobe.Tomcat70AgentValve.invoke(Tomcat70AgentValve.java:38)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)
Caused by: net.vidageek.mirror.exception.ReflectionProviderException: Could not invoke method save
	at net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:45)
	at net.vidageek.mirror.invoke.MethodHandlerByMethod.withArgs(MethodHandlerByMethod.java:54)
	at br.com.systembase.infra.CriadorDeSession$1.intercept(CriadorDeSession.java:75)
	at br.com.systembase.infra.CriadorDeSession$1.intercept(CriadorDeSession.java:72)
	at br.com.caelum.vraptor.proxy.CglibProxifier$2.intercept(CglibProxifier.java:95)
	at org.hibernate.Session$$EnhancerByCGLIB$$d7ef70ff.save(<generated>)
	at br.com.systembase.dao.HibernateSysDao.carrega(HibernateSysDao.java:376)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196)
	at $Proxy86.carrega(Unknown Source)
	at br.com.systembase.controller.SbUsuarioController.login(SbUsuarioController.java:97)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
	... 44 more

Muito obrigado pela ajuda de quem puder.

tem mais coisa na stacktrace?

Bom dia Lucas.

Aparecia sim, dava um NullPointer numa rotina de auditoria onde eu pegava o usuario logado, como o usuario tava nul dava erro.
Estou isolando o erro pra testar e ver o que ocorre, quando eu fazia a consulta no banco pra logar o usuario sempre voltava null, tudo começou aí, (não executa a query), então eu tentei salvar um objeto pra ver o que tava ocorrendo.
Fui eliminando umas coisas e tentei apenas salvar um objeto simples aqui, não aparece erro (finge salvar no banco, mas não salva)
To anexando umas imagens do meu debug, se puder dar uma força

Obrigado






se vc quer usar a transaction do spring, vc não pode usar o CriadorDeSessionFactory…

precisa usar a sessionFactory que vc configura no applicationContext.xml, a que está ligada no transactionManager…

assim é só colocar @Transactional no método que vc quer ter transação.

Lucas, blz, entendi o @Transaction
Sobre esse erro, voce tem idéia do que seja? (vejo isso quando passo o mouse em cima do método)
Volta usuario nulo, já setei usuario e senha na mão pra ver, mesmo assim, volta nulo

session.createCriteria(SbUsuario.class).add(Restrictions.eq("nome", usuario.getNome())).add(Restrictions.eq("senha", usuario.getSenha())).uniqueResult(); = >Unknown type "org.hibernate.criterion.Restrictions"<

Lucas, boa note, veja se voce consegue me dar um help:

To fazendo mais uns testes aqui (ainda não deu certo o Transaction)
A minha Interface esta assim:

public interface NewInterface {
    /**
     * @return the session
     */
    @Autowired
    public Session getSession();

    @Autowired
    public void setSession(Session session);

    /**
     * @param object
     * @return
     */
    @Transactional
    public abstract boolean inserir(Object object);

   .
   .
   .
}

O meu DAO está assim:


@Component
public class HibernateSysDao implements NewInterface {

    private Session session;

    public HibernateSysDao(Session session) {
        this.session = session;
    }

    @Transactional
    @Override
    public boolean inserir(Object object) {
        try {
            session.save(object);
//            result.include(SysMessages.STATUS_MESSAGE, localization.getMessage("SUCESS_RECORD_MESSAGE"));
            return true;
        } catch (HibernateException hibernateException) {
//           result.include(SysMessages.STATUS_MESSAGE, hibernateException.getCause().toString());
            return false;
        } catch (Exception exception) {
//           result.include(SysMessages.STATUS_MESSAGE, exception.getCause().toString());
            return false;
        }
    }

Fiz um metodo pra testar o Transaction

  @Transactional
    public void teste(NewInterface dao) {
        try {
            
            HibernateSysDao sysDao = new HibernateSysDao(dao.getSession());
            
            Produto produto = new Produto();
            produto.setNome("Produto 1 ");
            produto.setCodigo("Codigo 1");
            produto.setCodigoDeBarras("B1");
            produto.setEstoqueMinimo(5f);
            produto.setQuantidadeEstoque(200f);
            produto.setQuantidadeReserva(2f);
            produto.setDescricao("Desc - 1");
            produto.setPreco(new BigDecimal("35.90"));
            sysDao.inserir(produto);
  
            Produto produto2 = new Produto();
            produto2.setNome("Produto 2");
            produto2.setCodigo("Codigo 2");
            produto2.setCodigoDeBarras("B2");
            produto2.setEstoqueMinimo(5f);
            produto2.setQuantidadeEstoque(200f);
            produto2.setQuantidadeReserva(2f);
            produto2.setDescricao("Desc - 2");
            produto2.setPreco(new BigDecimal("35.90"));
            sysDao.inserir(produto2);
           
        } catch (Exception ex) {
            Logger.getLogger(Teste.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Daí to vendo a query e o metodo que esta sendo executado

objeto [Ljava.lang.Object;@1595930
executando save
Hibernate: 
    insert 
    into
        PRODUTO
        (ALTERADO_EM, ALTERADO_POR, CODIGO, CODIGO_DE_BARRAS, CRIADO_EM, CRIADO_POR, DESCRICAO, ESTOQUE_MINIMO, NOME, PRECO, QUANTIDADE_ESTOQUE, QUANTIDADE_RESERVA, VERSION) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
objeto [Ljava.lang.Object;@1154792
executando save
Hibernate: 
    insert 
    into
        PRODUTO
        (ALTERADO_EM, ALTERADO_POR, CODIGO, CODIGO_DE_BARRAS, CRIADO_EM, CRIADO_POR, DESCRICAO, ESTOQUE_MINIMO, NOME, PRECO, QUANTIDADE_ESTOQUE, QUANTIDADE_RESERVA, VERSION) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
objeto [Ljava.lang.Object;@1091f6e
executando close

Quando eu do um select no banco, nada feito…

O que isso quer dizer?

18:10:11,466  WARN [InjectionBeanPostProcessor] Autowired annotation should be used on methods with actual parameters: public org.hibernate.Session br.com.systembase.dao.HibernateSysDao.getSession()

Grato pela ajuda :frowning:

Pessoal, não sei se o que estou fazendo está certo
Fiz outros testes aqui e quando eu uso o metodo da interface direto dá commit no banco, mas ignora o transaction

assim faz commit, mas ignora o Transaction

@Transactional  
    public void teste(NewInterface dao) {  
        try {  
                          
            Produto produto = new Produto();  
            produto.setNome("Produto 1 ");  
            produto.setCodigo("Codigo 1");  
            produto.setCodigoDeBarras("B1");  
            produto.setEstoqueMinimo(5f);  
            produto.setQuantidadeEstoque(200f);  
            produto.setQuantidadeReserva(2f);  
            produto.setDescricao("Desc - 1");  
            produto.setPreco(new BigDecimal("35.90"));  
            dao.inserir(produto);  
    
            Produto produto2 = new Produto();  
            produto2.setNome("Produto 2");  
            produto2.setCodigo("Codigo 2");  
            produto2.setCodigoDeBarras("B2");  
            produto2.setEstoqueMinimo(5f);  
            produto2.setQuantidadeEstoque(200f);  
            produto2.setQuantidadeReserva(2f);  
            produto2.setDescricao("Desc - 2");  
            produto2.setPreco(new BigDecimal("35.90"));  
            dao.inserir(produto2);  
             
        } catch (Exception ex) {  
            Logger.getLogger(Teste.class.getName()).log(Level.SEVERE, null, ex);  
        }  
    }  
} 

Assim não dá commit

@Transactional  
    public void teste(NewInterface dao) {  
        try {  
              
            HibernateSysDao sysDao = new HibernateSysDao(dao.getSession());  
              
            Produto produto = new Produto();  
            produto.setNome("Produto 1 ");  
            produto.setCodigo("Codigo 1");  
            produto.setCodigoDeBarras("B1");  
            produto.setEstoqueMinimo(5f);  
            produto.setQuantidadeEstoque(200f);  
            produto.setQuantidadeReserva(2f);  
            produto.setDescricao("Desc - 1");  
            produto.setPreco(new BigDecimal("35.90"));  
            sysDao.inserir(produto);  
    
            Produto produto2 = new Produto();  
            produto2.setNome("Produto 2");  
            produto2.setCodigo("Codigo 2");  
            produto2.setCodigoDeBarras("B2");  
            produto2.setEstoqueMinimo(5f);  
            produto2.setQuantidadeEstoque(200f);  
            produto2.setQuantidadeReserva(2f);  
            produto2.setDescricao("Desc - 2");  
            produto2.setPreco(new BigDecimal("35.90"));  
            sysDao.inserir(produto2);  
             
        } catch (Exception ex) {  
            Logger.getLogger(Teste.class.getName()).log(Level.SEVERE, null, ex);  
        }  
    }  
} 

Abraço a todos

Pessoal, eu de novo…

Ainda não cheguei a uma conclusão, verificando no banco de dados, quando o sysDao.save é executado e o tomcat mostra pra mim o insert (mas não insere), eu perco o ID no banco, ou seja, parece que ocorre algo no banco que não deixa inserir, to bem perdido.

Outra coisa, eu to querendo usar a transação do Spring devido a umas experiencias ruins que tive num outro sistema, se eu tenho algo do tipo

public void criarVenda(){

Venda venda = new Venda();
venda.setComprador("José");
venda.setData(new Date());
meuDao.save(venda);//supondo que salvou certinho 1º

ItensDaVenda itens = new ItensDaVenda();
itens.setIdVenda(venda.getId());
itens.setNome("Produto 1");
itens.setValor(10);
meuDao.save(itens);//supondo que deu pau 2º
// aqui precisa dar rollback e desfazer a insersão da venda 1º
//criarTitulo(venda);//se dentro desse metodo der pau, também teria que desfazer tudo que foi feito antes
}

Somente usando o Vraptor eu consigo controlar isso? Porque no meu save dos DAOs tem o tx.commit() e já salva o registro no banco…de repente eu to quebrando a cabeça pra usar spring e posso conseguir o que eu quero sem ele, e utilizando apenas o Vraptor.

Alguma ajuda.

Feliz Natal e Ótimo 2013 a todos.

se vc já tá usando o spring, o melhor é configurar o Spring Transaction e usar o @Transactional pra fazer as transaçoes (daí vc remove todos os tx.commit())

Sim Lucas, na verdade eu já removi os tx.commit() do meu DAO, tenho o applicationContext.xml no path e tals…
to achando estranho executar a insersão (no log do servidor mostra os inserts), perder o ID no banco (depois da linha do save eu debugo e vejo que o objeto tem mesmo um ID), mas não salva o registro no banco,

Eu acho que deve ter algo errado na interface e/ou na classe que instancia a interface. No meu controller eu injeto a inteface, como vi em outros posts e na apostila
A 3 post acima eu fiz uns testes: usando o dao.save faz commit, usando o sysDao.save não faz
Teoricamente, o commit só poderia ser feito depois da perfeita execução do metodo

public void teste(NewInterface dao) não é?

Você tem me ajudado bastante, agradeço a atenção, espero matar esses problemas pra dar maior andamento no meu projeto.

Se puder me ajudar novamente, muito obrigado.

vc colocou o @Transactional? configurou o Spring Transactional?

O Transactional, sim:

@Transactional
    public void consultaStatusServico(InterfaceDAO dao) {
                 
            HibernateSysDao sysDao = new HibernateSysDao(dao.getSession());
            
            Produto produto = new Produto();
            produto.setNome(("Produto - " + Math.random()).replace(".", ""));
            produto.setCodigo(("" + Math.random()).replace(".", "").substring(0, 5));
            produto.setCodigoDeBarras(("BC-" + Math.random()).replace(".", "").substring(0, 6));
            produto.setEstoqueMinimo(5f);
            produto.setQuantidadeEstoque(200f);
            produto.setQuantidadeReserva(2f);
            produto.setDescricao("1º - " + new Date());
            produto.setPreco(new BigDecimal("35.90"));
            sysDao.save(produto, result, localization);// tambem tem o @Transactional
           
            Produto produto2 = new Produto();
            produto2.setNome(("Produto - " + Math.random()).replace(".", ""));
            produto2.setCodigo(("" + Math.random()).replace(".", "").substring(0, 5));
            produto2.setCodigoDeBarras(("BC-" + Math.random()).replace(".", "").substring(0, 6));
            produto2.setEstoqueMinimo(5f);
            produto2.setQuantidadeEstoque(200f);
            produto2.setQuantidadeReserva(2f);
            produto2.setDescricao("2º - " + new Date());
            produto2.setPreco(new BigDecimal("35.90"));
            sysDao.save(produto2, result, localization);    
    }

configurar o Spring Transactional seria isso?

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
    <!--<tx:annotation-driven />-->
    <bean id="transactionManager"
          class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <bean id="sessionFactory"
          class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="configLocation">
            <value>classpath:/hibernate.cfg.xml</value>
        </property>
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager"/>  
</beans>

vc precisa configurar a tag de component-scan também, apontando pro seu base-package

Essa configuração é no applicationContext.xml, certo?

<context:component-scan base-package="br.com.systembase.infra" />

Essa copnfiguração é no AppplicationContext.xml, certo?

<context:component-scan base-package="br.com.systembase.infra" />

é que ainda não foi…
Vou tentar mais…

(Foi mal a duplicação, foi sem querer)

yep

a classe que está com @Transactional é uma @Component?

a session que vc tá usando é a do spring?

A classe não estava anotada com @Component, agora eu anotei, mas sem sucesso

@Component
public class NfeManager {
  
@Transactional
    public void consultaStatusServico(InterfaceDAO dao, Result result, Localization localization) {
            
            HibernateSysDao sysDao = new HibernateSysDao(dao.getSession());
            
            Produto produto = new Produto();
            produto.setNome(("Produto - " + Math.random()).replace(".", ""));
            produto.setCodigo(("" + Math.random()).replace(".", "").substring(0, 5));
            produto.setCodigoDeBarras(("BC-" + Math.random()).replace(".", "").substring(0, 6));
            produto.setEstoqueMinimo(5f);
            produto.setQuantidadeEstoque(200f);
            produto.setQuantidadeReserva(2f);
            produto.setDescricao("1º - " + new Date());
            produto.setPreco(new BigDecimal("35.90"));
            sysDao.save(produto, result, localization);            
  
            Produto produto2 = new Produto();
            produto2.setNome(("Produto - " + Math.random()).replace(".", ""));
            produto2.setCodigo(("" + Math.random()).replace(".", "").substring(0, 5));
            produto2.setCodigoDeBarras(("BC-" + Math.random()).replace(".", "").substring(0, 6));
            produto2.setEstoqueMinimo(5f);
            produto2.setQuantidadeEstoque(200f);
            produto2.setQuantidadeReserva(2f);
            produto2.setDescricao("2º - " + new Date());
            produto2.setPreco(new BigDecimal("35.90"));
            sysDao.save(produto2, result, localization);
    }
}

A session que estou usando é do spring sim (é a do CriadorDeSession, alterada conforme apostila)

@Component
@RequestScoped 
public class CriadorDeSession implements ComponentFactory<Session> {

    private  SessionFactory sessionFactory;
    private  Proxifier proxifier;
    private Session session;

    public CriadorDeSession(SessionFactory sessionFactory, Proxifier proxifier) {
        this.sessionFactory = sessionFactory;
        this.proxifier = proxifier;
    }

    @PostConstruct
    public void abre() {
        this.session = proxifier.proxify(Session.class, new MethodInvocation<Session>() {
            @Override
            public Object intercept(Session proxy, Method method, Object[] args, SuperMethod superMethod) {
                Session sessionDoSpring = SessionFactoryUtils.getSession(sessionFactory, true);
                // System.out.println(args);
                // System.out.println(sessionFactory);
                // System.out.println(method.getName());
                return new Mirror().on(sessionDoSpring).invoke().method(method).withArgs(args);
            }
        });
    }

    @Override
    public Session getInstance() {
        return this.session;
    }

    @PreDestroy
    public void fecha() {
        this.session.close();
    }
}

mas vc tá recebendo esse NfeManager no construtor da classe que usa? ou tá dando new?

se vc tá dando new não vai funcionar mesmo, tem que vir como dependência!