Pessoal,
Estou desenvolvendo uma aplicacao Mobile que irá acessar minha base de dados via WebService (já implementado e utilizado por outras aplicações). Como ainda não existe um framework maduro para trabalhar com WS em aplicações mobile (tem o Ksoap2, mas seria muito trabalhoso), decidimos criar então um Servlet que servirá como ponte entre o WebService e a aplicação Mobile (Iphone) por motivos de processamento e trafego de rede. (A aplicação mobile chamará o servlet, que se encarregará de chamar os metodos do WS e irá converter os objetos retornados do WS em um formato mais adequado para uma aplicação mobile (Json, por exemplo).
WebService.java
@Stateless
@WebService(name="EmpresaWS", serviceName="EmpWS")
public class EmpresaWS implements IEmpresaWS {
@Resource private WebServiceContext ctx;
HttpSession sessao;
...
@WebMethod
public Session autenticarUsuario(String user, String senha) {
//valida login
return criarSessao();
}
private Session criarSessao(){
MessageContext msgCtx = ctx.getMessageContext();
HttpServletRequest request = (HttpServletRequest)msgCtx.get(MessageContext.SERVLET_REQUEST);
return request.getSession();
Gostaria de chamar o WebService via Servlet sem precisar gerar um cliente do mesmo (classes stub, endpoints, etc) pois a aplicação Middle (servlet) estará no mesmo servidor de aplicação que o WebService. Eu queria chamar o componente diretamente mas não esta funcionando. Eu consigo injetar o EJB do WS no servlet, mas a propriedade WebServiceContext, anotada com @Resource, nao é injetada no WS corretamente, sempre gerando uma exception ao ser invocada no metodo criarSessao do WS e não consegui encontrar outra maneira de acessar/instanciar o WebServiceContext sem ser via anotação @Resource.
A exception é: java.lang.IllegalStateException: WebServiceContext not available.
MiddelServlet.java
public class MiddleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@EJB(mappedName="XXX-Ear/EmpresaWS/remote") private IEmpresaWS service;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
String acao = request.getParameter("acao");
String usuario = request.getParameter("user");
String senha = request.getParameter("pwd");
Session sessao = service.autenticarUsuario(usuario, senha); //chama o WS diretamente
...
}
}
Alguém sabe me dizer se é possível fazer isso da maneira como estou fazendo, ou eu tenho mesmo que gerar um cliente do WebService?
Também gostaria de saber a opinião de vocês, sobre qual a melhor forma de fazer essa integração (Aplicação Mobile e WebService Soap).