HTTP 404 - WebService não inicia em produção

28 respostas
javawebjava
R

Fala pessoal!! Tudo certo? Então, tô com um sério problema aqui, meu webservice roda normal em localhost, mas quando eu jogo no domínio ele não vai!!

Olha os prints:

image

Meu ApplicationConfig:

@javax.ws.rs.ApplicationPath("api")
public class ApplicationConfig extends Application {

Minha classe do WebService

@Path("")
public class ws {
       @GET
    @Produces("application/json")
    @Path("user/list")
    public String list_user() {
        List<User> list;

        UsersDAO dao = new UsersDAO();
        list = dao.listar();

        Gson g = new Gson();
        return g.toJson(list);
    }
}

EDIT: No log do servidor também não acusa nenhum erro, o estranho é que quando eu acesso o index.html, do projeto (ONLINE), ele mostra o index

image

28 Respostas

V

@rodriguesabner
Fala dev, blz? Acho q o seu problema está na definição da sua rota…eu faria assim

@Path("/")
 public class ws{
          @GET  
          @Produces("application/json")
          @Path("user/list")
          public String list_user(){
                List<User> list;
                
                UsersDAO dao = new UsersDAO();
                list = dao.listar();

                Gson g = new Gson();
               return g.toJson(list);
      }
}

Espero que ajude, boa sorte.

R

Opa Villagram, quanto tempo, assim que eu chegar em casa eu faço o teste. Sabe explicar se isso realmente causa alguma interferência? Eu consigo rodar localmente o Webservice

V

Realmente faz muito tempo…hehehehe…existem outras coisas que podem interferir em produção, mas como a rota não está sendo encontrada no contexto…acho q é isso.

Eu uso Spring para construir minhas aplicações Rest então eu realmente estou chutando forte…hehehehehe. Precisaria ver os logs do Tomcat para ter certeza.

R

Pior que o log não acusa nada, fala que fez o deploy e simplesmente não roda, mas é uma boa opção, até porque do jeito que está “sem path”, então o encontra o Index, mas não encontra o que vem depois. Vou tentar!! Valeu mesmo

B

como está o mapeamento no web.xml?

tente:
@Path("/user/list")

R

Já testo!!!

R

Boa noite!!

Então, fiz as mudanças que vocês indicaram, mas continua o mesmo, fui olhar meus endpoints no Localhost e ficou meio bugado

image

@Path("/")
public class ws {

    @Context
    private UriInfo context;

    public ws() {
    } 
}

@GET
    @Produces("application/json")
    @Path("/user/list")
    public String list_user() {
        List<User> list;

        UsersDAO dao = new UsersDAO();
        list = dao.listar();

        Gson g = new Gson();
        return g.toJson(list);
    }

Olhei o meu .log e só fala e está tudo normal:

2019-09-10 20:52:51,919 [localhost-startStop-1] INFO  org.apache.catalina.startup.HostConfig- Deployment of web application directory [/opt/web/webapps/.old] has finished in [105] ms
2019-09-10 20:52:52,010 [main] INFO  org.apache.coyote.http11.Http11NioProtocol- Starting ProtocolHandler ["http-nio-8080"]
2019-09-10 20:52:52,030 [main] INFO  org.apache.catalina.startup.Catalina- Server startup in 2102 ms
V

Boa noite amigo…

Só coloque a barra no @Path da classe ou no método…é por isso que ficou bugado. hehehehe.

Acho q só isso já resolve.

R

Nada, o problema é no Path mesmo! Olha:

@Path("/")
public class ws {}

@GET
@Produces("application/json")
@Path("user/list")
public String list_user() {}

image

V

Então melhor tirar o @Path da classe por completo e deixar só o do método…

R

Eu já fiz isso bro, mas dá o mesmo erro. Online ele não acha o path, mas offline fica normal

V

Essa aplicação foi toda construida por você ou tem mais pessoas envolvidas? O que parece é que o serviço não está sendo exposto no contexto.

R

Só por mim, então, quando eu abro o Index do projeto ele mostra normal, mas quando é pra setar algum path ele não encontra, como se estivesse errado. Creio que se o problema fosse no servidor, o Index nem iniciava

V

Vi aqui que você está utilizando o IIS para publicar a API provavelmente é alguma configuração nele que está impedindo de ir além do root.

V

@rodriguesabner

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true" />
        <handlers>
            <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
            <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
</system.webServer>
V

@rodriguesabner
Acabei de pensar em algo aqui…tem dados para retornar nesse serviço??

R

Já testo esse código, e sobre os dados, sim, já tô alimentando. Eu tô fazendo um app e já tenho que fazer alguns testes de como vai ficar

R

IIS não é .NET? Eu tentei jogar o código que você mandou acima no web.xml, mas não tive sucesso. Troquei do hospedagem pra ver se era um problema deles, mas o erro continua. Eu usei Java pra gerar o serviço. Com certeza é erro de configuração (só não sei qual), eu fiz um teste com o php e consegui rodar tranquilo no servidor online.

V

Você precisa usar assim não pode utilizar um framework como o Spring?

R

Olha, em JavaEE sou bem ignorante kkkkk, quando se trata de web eu tenho menos complicação com PHP. Então resumindo, eu sei o básico do básico do JavaEE

V

Entendido, essa biblioteca que você está usando em Java sempre me deu dor de cabeça para configurar, se tiver necessidade de fazer Java mesmo eu posso te ajudar a construir com Spring se não tiver nenhum problema pra você é claro.

Quando eu tinha problemas na configuração do jeito que você está tendo eu apagava todo o projeto e escrevia novamente e na maioria das vezes rodava, mesmo não tendo mudado nada.

Se quiser ajuda com Spring me passa um e-mail com cel e a gente vai conversando por lá. [email removido]

J

Se ta no início do projeto vale mais jogar fora e mudar pra spring boot. E se for uma aplicação média, PHP seria mil vezes mais prático.

R

Estamos no inicio sim, pois é, se tratando de web o PHP facilita bastante. Na primeira tentativa o wservice já funcionou

J

Se PHP atende é perda tempo manter em Java, que é bem mais custoso, tanto em desenvolvimento quanto em infra.

B

tenta tirar a barra no Path

assim:

@Path("")
public class QualquerCoisa

R

Eu deixava sem, na verdade só funcionava sem a /, fazendo isso localmente funcionava tranquilo, mas online não funcionava de jeito nenhum. Minha solução foi trocar pro PHP mesmo.

Como é chatinho encontrar isso (ainda mais em postgresql), vou postar o código:

arquivo: get_all.php

<?php
header('Content-Type: application/json');

require_once('db.php');

$SQL = 'SELECT * FROM suatabela ORDER BY id';

$statement = $connection->prepare($SQL);
$statement->execute();
$menu = $statement->fetchAll(PDO::FETCH_OBJ);

$data = array();

foreach ($menu as $item) {
    //$data[] = $item; //print_all
    $data['coluna_0'] = $item->nome_da_coluna;
    $data['coluna_1'] = $item->nome_da_coluna;
    $data['coluna_2'] = $item->nome_da_coluna;
    $data['coluna_3'] = $item->nome_da_coluna;
    $data['coluna_4'] = $item->nome_da_coluna;
    $data['coluna_5'] = $item->nome_da_coluna;
}

$final = json_encode(['nome_da_colecao' => $data]);
echo $final;

db.php

<?php
$dsn = 'pgsql:host=localhost;dbname=banco';
$username = 'user';
$password = 'senha';
$options = [];
try {
$connection = new PDO($dsn, $username, $password, $options);
} catch (PDOException $e) {
echo $e;
}

Output:

{"nome_da_colecao":{"coluna_0":1,"coluna_1":"Alguma Coisa","coluna_2":"Alguma Coisa","coluna_3":"Alguma Coisa","coluna_4":"Alguma Coisa","coluna_5":"Alguma Coisa"}}
J

Boa decisão. Se for o caso pode simplificar mais o script retornando json direto pelo PDO: https://stackoverflow.com/questions/2770273/pdostatement-to-json

R

Boa!

Criado 7 de setembro de 2019
Ultima resposta 13 de set. de 2019
Respostas 28
Participantes 4