vRaptor - Web Service - Interceptor Transactional

Bem, antes de mais nada, sim vou precisar sim trabalhar com webservice, só que é o seguinte, andei dando uma boa olhada no material que o pessoal respondeu mais nao consegui chegar até minha duvida.

Preciso utilizar um webservice e preciso garantir que ele pegue um Session hibernate, só que quem está passando essa session atraves de injeção de dependencia é o vraptor com o plugin vraptor-hibernate, ele é quem faz o rollback e commit atraves da session que ele cria, e quem cria o WS nao é o vraptor, bem, o que eu pensei primeiramente é criar um interceptor da seguinte forma:

@Intercepts
public class TransactionInterceptor implements Interceptor {
        private final Session session;
        public HibernateTransactionInterceptor(Session session) {
            this.session = session;
        }
        public void intercept(InterceptorStack stack, ResourceMethod method,
                                Object instance) {
            Transaction transaction = null;
            try {
                transaction = session.beginTransaction();
                stack.next(method, instance);
                transaction.commit();
            } finally {
                if (transaction.isActive()) {
                    transaction.rollback();
                }
            }
        }
        public boolean accepts(ResourceMethod method) {
            return true; //aceita todas as requisições
        }
}

e criar uma fachada que se comunicará com o webservice e essa fachada terá os metodos @transactional, minha duvida é: quando o webservice se comunicar com essa fachada o vraptor criará o interceptor onde injetará a session e interceptará esses metodos garantindo pra mim que ele seja transactional? ou nem mesmo o vraptor chegará a criar esse interceptor?

espero que tenha sido claro, estou imperrado e precisando utilizar esse webservice e não queria deixar de utilizar o vraptor.

obs: em momento algum o webservice chegará a conhecer o Controller.

Acho que vc ta confundindo as coisas

se seu webservice precisa da session do hibernate, deixe essa responsabilidade com ele

ai vc tera o seguinte

uma aplicação usando o Vraptor

e o webservice

vraptor conhecera o webservice e o webservice cuidara da persistencia usando o hibernate

deixa eu ser mais simples, suponha que o webservice client vai chamar uma interface UsuarioRepositorio

@Component
public class UsuarioDAO implements UsuarioRepositorio {
...
public UsuarioDAO(Session sessao) {
...
}
...
}

minha duvida é: quando o webservice cliente chamar o UsuarioRepositorio, o vraptor irá passar a session para o UsuarioDAO? sim, não?

cara vc ta sendo muito confuso.

vc quer que o sua aplicação usando o vraptor acesse um webservice ou que o webservice acesse a aplicação com vraptor

mostra como esta estruturado esses projetos?

tira um print da sua ide com a estrutura dos projetos

e mostro quem e quem na imagem

nossa, posso ter confudido vocês mesmo dessa forma, obrigado por me corrigir, no caso é o WEBSERVICE que vai ACESSAR minha aplicação.

basicamente o webservice vai acessar minha logica que vai acessar o banco e listar objetos e retornar atraves do webservice.

Danilo, ainda nao implementei o codigo, estou querendo saber se funciona, vou começar a implementar daqui a pouco quando sair aqui do trabalho.

supondo que vc tem dois projetos

1 Aplicação com VRaptor

2 Aplicação Webservice

e Aplicação VRaptor acessa dados do Banco Atraves do WebService , então não eh possivel fazer o Vraptor fazer injeção de dependecia em um WebService

vc deve pensar em duas aplicações separadas, e cada uma delas deve gerenciar suas próprias dependências

quando vc cria um cliente pra um webservice vc quer apenas usar os serviços que ele te fornece, e pouco importa como ela faz isso por baixo dos panos

se o vraptor vai ser um cliente de um webservice, ele quer apenas usar o serviço ele não tem que fornecer as dependencias para o webservice

cara, você ainda nao está entendendo, suponha que ja tem um webservice que precisa acessar minha aplicação vraptor(minha aplicação vraptor possui os controlladores, classes dao que acessam o banco) eu quero que o webservice acesse a classe usuarioDAO e possa listar os usuarios.

eu quero saber se na classe do wscliente quando eu chamar o usuarioDAO que possui uma Session no construtor, se o vraptor vai passar essa sessao, é somente essa minha duvida.

se o webservice vai acessar a aplicação VRaptor via HTTP, ok, ele vai usar a mesma sessão.

Senão, é uma aplicação diferente e os componentes registrados não ficarão acessíveis ao seu webservice…

no máximo vc vai conseguir uma integração usando o Spring, se ele subir o webservice.

Lucas, mais tem como ele acessar minha aplicação via HTTP o web service sendo soap? se sim como?

você pode acessar sua aplicação via HTTP de qualquer código java, ou qualquer outra linguagem.

só dentro do webservice vc pegar algum cliente HTTP e fazer a requisição…

mais infelizmente a empresa que trabalho nao vai poder trabalhar dessa maneira, ou seja, atraves do http, preciso servir alguns serviços da minha aplicação vraptor, como por exemplo listar os usuarios cadastrados, porem quem cuida da injeção do hibernate Session é o vraptor, e estou apanhando para conseguir de alguma maneira repassar isso para o webservice sem que o webservice passe por um controller.

pesquise sobre como subir webservices com o Spring, e use o VRaptor com o Spring como provider, daí vc vai conseguir fazer o que vc quer.

Lucas, o webservice com o spring (JAX-WS + Spring), fiz helloworld para teste e já consegui e já está funcionando aqui app Context, libs, tudo direitim.

quanto ao spring como provider, você tem algum material daqui ou do proprio vraptor para fornecer? estou buscando aqui.

lembrando que eu preciso garantir o commit e rollback dos dados, e isso na minha aplicação está sendo feito pelo vraptor-hibernate.jar, vai afetar em algo se eu deixar o spring como provider?

é fácil: tire os jars do guice, coloque os jars do spring.

se não funcionar o commit e rollback, é só configurar o Spring Transaction…

tem algum material do mostrando como configura o SpringTransaction para o vraptor ?

vc pode usar qualquer material sobre SpringTransaction

a parte do VRaptor funciona da mesma maneira.

a única diferença é se vc quiser receber Session/EntityManager direto no construtor, daí vc tem que criar uma componentFactory pra isso: