Passando parametros transparentes para o webservice

Olá,

Eu nem sei como explicar direito o que quero fazer…vou tentar…

Do lado do meu servidor JSF eu tenho um objeto setado na sessão que me diz qual o usuário, modulo, rotina, … a pessoa esta acessando naquela página JSF. Quando esta página JSF faz uma requisição para um webservice eu gostaria de passar estas informações usuário, modulo, rotina, … de forma implícita, sem ter que passar como um parâmetro do meu método no webservice. Se tiver que passar com parâmetro, vou ter que alterar 150 webservices, onde cada um tem 3-10 métodos…

Minha suposição é que eu posso fazer isso com filtros do lado do JSF e do Webservice, mas não tenho a mínima idéia de como fazer isso e nem se é realmente possível. O filtro para meus JSF colocaria junto da requisição o objeto setado na sessão e no lado do webservice eu recuperaria esse objeto e setaria ele em outro objeto global com qual vou trabalhar dentro do metodo do webservice.

Alguma idéia? alguém entendeu o que preciso? Me parece uma coisa tão pratica que eu creio que deve existir um meio de se fazer isso…

Obrigado por qualquer ajuda,
Sérgio

bump

Bom eu acho que achei uma solução, mas não tenho certeza de como fazer…descobri que posso setar parâmetros no request/response dos servlets

Minha idéia é:

//lado do JSP em um servlet filter request.getParameterMap().put("MyObject", myObject);

//lado do webservice em um servlet filter myObject = (MyObject)request.getParameter("MyObject");

Mas, não tenha certeza quanto a como setar o filtro, eu preciso de um filtro de saída (JSP enviando request para o webservice) e não tenho idéia se o filtro esta setado pra isso. Meu filtro no JSP esta assim:

[code]

ServletParameterFilter
br.com.teste.ServletParameterFilter

<filter-mapping>
    <filter-name>ServletParameterFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
</filter-mapping>
<!-- FILTERS -->[/code]

No webservice é parecido, mas o url-pattern é /WebServices/*

Estou no caminho certo? alguma comentario?

Duvida conceitual: usando REST eu poderia passar algumas informações (como os do exemplo usuário, modulo, rotina) no cabeçalho HTTP?

Odeio fazer manutenção de programas que têm esses recursos mágicos, como o que você está tentando criar. Isso faz com que seu sistema só funcione em uma determinada versão do seu application server, e em determinadas condições de temperatura e pressão (ou seja, ele fica muito “frágil” e pode até ser que não funcione em produção porque a versão do application server em produção não suporte essas gambiarras que podem ser feitas no application server na versão de desenvolvimento.)
Eu prefiro:

  • Que nunca seja usado a sessão do web container em web services (já vi isso sendo usado, mas acho coisa muito porca e difícil de portar para outros web containers, ou mesmo para outros ambientes como .NET ou PHP);
  • Que todos os parãmetros que devam ser passados sejam explícitos;
  • Que parâmetros que não estejam previstos na especificação original sejam passados em um XML ou outra coisa que permita expansão.

@peczenyj: Eu li um pouco sobre REST agora, mas parece que teria que fazer uma mudança grande demais no sistema e nesse caso seria simplesmente melhor alterar a assinatura dos métodos dos webservices para receber os parâmetros que eu preciso

@thingol: concordo com você, tem seu lado ruim. O problema não esta na minha mão, mas estou tentando achar uma solução que de o menor impacto possível no sistema, sair alterando todos os 150 webservices que tenho aqui. Estou aberto a qualquer idéia…Só não quero meu pessoal gastando 1-2 semanas pra fazer isso, pois tem coisas mais importantes no momento a serem feitas.

Sérgio

Yeap, no cabeçalho ou no body, dependendo de qual método HTTP você pretende utilizar.

Quanto ao problema do tópico, o mais prático seria enviar por debaixo dos panos mesmo, mas como o thingol disse, eu já fiz isso e, na hora da manutenção isso fica sacal de descobrir os parâmetros mágicos que estão sendo passados.

Uma divagação, se você não quer alterar os trocentos webservices que já existem, por que num cria um tipo de identificação de sessão?
Cada requisição agora vira duas, a primeira solicitação envia os dados que você quer, o websevice cria um tipo de pseudo-session e retorna uma identificação pra ela, e a segunda requisição executa realmente o webservice que se quer, mas com a identificação da sessão anterior.
Bem, só uma idéia que tive agora, tem que analisar o overhead da requisição a mais, como enviar a identificação depois(com esse filter que você criou por exemplo), etc…

Rafael, não tenho idéia de como fazer uma pseudo-sessão em um webservice que é stateless. De qualquer maneira acho que sua idéia não foge muito da idéia dos “parâmetros mágicos”, agora parece que virou uma “sessão mágica” hehehe :wink: .

Vou testar melhor o código dos “parâmetros mágicos” pois deu um problema do ParameterMap estar com “locked”, creio que vou ter que criar um wrapper pro servletrequest para poder alterar o ParameterMap, só vou ter tempo pra fazer isso segunda-feira, dae eu dou um retorno pra voces.