1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Consumir um webservice REST de um projeto via servlet de outro - JBOSS AS 7

Fala, galera!

Tenho um projeto, que resolvi dividir em dois: um core e um web. O core usa CDI com todas as regras de persistência e de negócio, expondo suas funcionalidades via webservices REST e JSon. Já o projeto web é só o html, com bootstrap e angular. "Porque você resolveu fazer assim, seu animal", alguém pode perguntar. Porque se, mais tarde, eu resolver fazer um app para celular, basta consumir os webservices já existentes. Achei que fica mais prático.

Antes de mais nada, ressalto que uso o JBoss AS 7, tanto em ambiente de desenvolvimento quanto de produção.

Pois bem, localmente, tudo está funcionando, quando mandei para o provedor de hospedagem, tudo funcionou beleza também. O angular chama os webservices, atualiza base de dados e tudo. Uma verdadeira belezura! Mas, como nem tudo são flores nessa vida, apareceu a circunstância de precisar fazer um upload de um arquivo texto. Foi quando começou minha tristeza.

Pesquisei como fazer com o angular e achei muito complicado. Resolvi fazer com uma servlet no meu projeto web mesmo. O usuário submete o arquivo, a servlet o recebe, trata e, para gravar o registro do cliente, aciona um webservice específico para isso, existente no projeto core.

Espero ter sido claro na minha intenção.

Localmente, em minha máquina funciona. Dá pau no ambiente de produção, lá no provedor. O que acontece é que, na hora de consumir o webserver do core dentro do servlet, recebo diacho de um erro 500 com esse stacktrace:

java.net.UnknownHostException: <<www.nomedomeusite.com.br>>
    java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178)
    java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    java.net.Socket.connect(Socket.java:579)
    java.net.Socket.connect(Socket.java:528)
    sun.net.NetworkClient.doConnect(NetworkClient.java:180)
    sun.net.www.http.HttpClient.openServer(HttpClient.java:432)
    sun.net.www.http.HttpClient.openServer(HttpClient.java:527)
    sun.net.www.http.HttpClient.<init>(HttpClient.java:211)
    sun.net.www.http.HttpClient.New(HttpClient.java:308)
    sun.net.www.http.HttpClient.New(HttpClient.java:326)
    sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:996)
    sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:932)
    sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:850)
    sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1300)
    br.com.bonysoft.servlet.FileUploadServlet.doPost(FileUploadServlet.java:205)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:754)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:847)

Todo o resto, as gravações, leituras e navegação funcionam (inclusive as que usam os webservice do core, via angular). Apenas a chamada ao webservice provenientes da servlet de upload me retornam esse erro. Vejam o código:

HTML:

<div class="container" >

    <form name="form1" id="form1" action="servletUpload" method="post" enctype="multipart/form-data">

        <div class="container col-md-12 col-lg-12" style="padding-top: 20px; margin-bottom: 20px;">

            <div class="panel panel-default">

                <div class="panel-heading">
                    <h3 class="panel-title">IMPORTAÇÃO DE PLANILHA DE CLIENTES</h3>
                </div>

                <div class="panel-body">
                    <input type="file" size="150" name="file1" id="idfile1" style="width: 100%;">                            
                </div>

            </div>

        </div>


        <div class="form-group">
            <button type="submit" class="btn btn-primary" >Confirmar upload</button>
            <button type="button" class="btn btn-primary" ng-click="desistir();">Desistir da operação</button>
        </div>

    </form>


</div>

SERVLET DE TRATAMENTO DO ARQUIVO:

String uri = "http://www.meudominio.com.br/cliente/uploadCliente/fulano/fulano@gmail.com/fone1/fone2";

URL url = new URL(uri);

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

connection.setRequestMethod("GET");
connection.setRequestProperty("Accept", "*/*");

InputStream xml = connection.getInputStream();

String ret = xml.toString();

connection.disconnect();

CÓDIGO RELEVANTE DO WEB SERVICE REST EXPOSTO

    @GET
    @Path("cliente/uploadCliente/{nome}/{email}/{fone1}/{fone2}")
    public void uploadCliente(
            @PathParam("nome") String nome,
            @PathParam("email") String email,
            @PathParam("fone1") String fone1,
            @PathParam("fone2") String fone2) throws Exception {


           Cliente cliente = new Cliente();
            cliente.setEmail(email);
            cliente.setFoneResidencial(fone1);
            cliente.setFoneComercial(fone2);
            cliente.setNome(nome);

            clienteDAO.gravar(cliente);

            entityManager.flush();

     }

Uma vez que toda essa idéia funciona localmente e só acontece o problema ao rodar no JBoss da minha hospedagem, tenho quase certeza de que se trata de alguma configuração do JBoss. Algum parametro de segurança, sei lá.

Se alguém tiver alguma idéia, agradeço fortemente.

Abraço a todos

  • Cara já começa estranho pelo fato de você ter um form com requisição post e seu webservice estar anotado com @GET, já teria que dar erro neste momento, mas pelo visto ele entra no webservice né quando faz o teste local. Possa ser que o seu dominio esteja bloqueado ou sua aplicação esteja em http e ta tentando acessar https.

    danillonc   22 de mai de 2015
  • É que, no projeto WEB, do html pra servlet é mesmo via POST. Lá de dentro da Servlet, depois que trata o arquivo e monta a string da url, ele aciona o webservice do projeto CORE passando via GET (na url) os parâmetros pra ele, captou?

    bonissauro   22 de mai de 2015
  • Mas acho que é mesmo algo como alguma configuração de segurança do JBoss pra que dominios diferentes não se comuniquem. Quando testo localmente, ambos são localhost, então não dá problema.

    bonissauro   22 de mai de 2015
  • Beleza. Os outros WS você chama da mesma forma ?

    danillonc   22 de mai de 2015
  • Não. Todas as demais chamadas são feitas pelo angular, diretamente na camada visão, via javascript, trafegando jSon de um lado para outro.

    bonissauro   23 de mai de 2015
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags rest ou faça a sua própria pergunta.