VRaptor3 / Spring (como invocar um componente do VRaptor de forma statica)?

1 resposta
Lavieri

O meu problema é o seguinte eu tenho um compent chamado LoginSession.

E eu tenho um serviço, que faz login/logout nele, e que salva o histórico de login/logout.

porém eu quero salvar histórico também de sessãos que expiram. Neste caso quando o login expirar o @PreDestory é ativado.

Porem neste momento eu estou fora de uma requisição, e não tenho com guardar uma factory de session, ou um session dentro de uma sessão, eu gostaria de forma estatica chamar o meu componente "NoScopedRepositoryCreator" que tem escopo de applicativo (avisando que não posso pegar uma referencia dele no construtor, pois ele não é serializavel e não tem como ser, pois ele tem uma factory dentro.).

Ai minha duvida é, como fazer, para de forma estatica, invocar um componente do VRaptor, acredito que seja via Spring, mas eu não sei que classe/método invocar para buscar a referencia.

Sei que o objeto vai existir no Spring, pois seu scopo é Application.

Abaixo segue trecho onde tenho o problema

@Component
@SessionScoped
public class LoginSession implements Serializable {
	private static final long serialVersionUID = 1L;
	private HistoricoLogin historicoLogin;
	

	@PreDestroy
	protected void timeout() {
		if (isLogado()) {
			HistoricoLogout logout = HistoricoLogout.create(historicoLogin, HistoricoLogoutMotivo.TIMEOUT);
			//O PROBLEMA ESTA AQUI!!!!! ABAIXO... 
			//esse SpringContianer.... não existe, eu que coloquei ai para ilustrar o que quero
			NoScopedRepositoryCreator repoCreator = SpringContainer.instanceFor(NoScopedRepositoryCreator.class);
			Repository repo = repoCreator.crateRepository();
			repo.beginRecording();
			repo.add(logout);
			repo.commitRecord();
			repo.close();
		}
		
	}
}

1 Resposta

Lucas_Cavalcanti

faça isso no seu NoScopedRepositoryCreator:

@Component
@ApplicationScoped
public class NoScopedRepositoryCreator {
    private static NoScopedRepositoryCreator INSTANCE;
    //....
    @PostConstruct
    public void setInstance() {
         INSTANCE=this;
    }

    public static NoScopedRepositoryCreator getInstance() {
           return INSTANCE;
    }
}

e pra usar é só NoScopedRepositoryCreator.getInstance();

evite ao máximo fazer esse tipo de coisa, mas isso deve funcionar

Criado 2 de setembro de 2010
Ultima resposta 2 de set. de 2010
Respostas 1
Participantes 2