[RESOLVIDO] - Erro HTTP 500 - Primeiro web application simples

42 respostas Resolvido
java
S

Bom dia pessoal, estou fazendo meu primeiro projeto web no NetBeans e não consigo fazer a tela do login funcionar, pelo erro que estou recebendo o problema parece ser na servlet que criei, porém, não consigo descobrir o que está acontecendo.

Estou usando o PostgreSQL como banco de dados e o TomCat 9.0

Segue abaixo o erro que recebo ao fazer o submit do form

Exception

javax.servlet.ServletException: Error instantiating servlet class [servlets.acao3] org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587) org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.base/java.lang.Thread.run(Thread.java:835)

Root Cause

java.lang.RuntimeException: servlets.acao3.(acao3.java:1) java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500) java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587) org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.base/java.lang.Thread.run(Thread.java:835)

Fico grato a quem possa me ajudar!

42 Respostas

R

Boa tarde! Erro 500 é causado por erro interno do servidor. Tenta reiniciar o servidor, talvez volte. Senão voltar a funcionar, exclui o Apache e instala de novo

S

Vou testar assim que chegar em casa e te retorno.
Tentei reiniciar ele diversas vezes mas ele fica num loop infinito e não reinicia

L

Mostra o código, tanto a classe do servlet como o web.xml se estiver usando. Está dando um erro na hora que o servidor vai instanciar seu servlet e é difícil saber o que é sem olhar o código.

S

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <servlet>
        <servlet-name>acao3</servlet-name>
        <servlet-class>servlets.acao3</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>acao3</servlet-name>
        <url-pattern>/acao3</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>

servlet acao3.java

package servlets;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import entidade.Usuario;

import dao.LoginUsuarioDAO;

import javax.servlet.RequestDispatcher;

import javax.swing.JOptionPane;

WebServlet(name = “acao3”, urlPatterns = {"/acao3"})
public class acao3 extends HttpServlet {

HttpServletRequest requisicao;
HttpServletResponse resposta;

/**
 * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    try ( PrintWriter out = response.getWriter()) {
             
    
     
    
    }
}




Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    requisicao = request;
    resposta = response; 
    //doGet(requisicao, resposta);

        String parametro = request.getParameter("param");
        
        if (parametro.equals("loginSistema")){
        String user = request.getParameter("user");
        String senha = request.getParameter("pass");
        
        Usuario u = new Usuario();
        u.setNome(user);
        u.setSenha(senha);
        LoginUsuarioDAO login = new LoginUsuarioDAO();                    
        
        if(login.Autenticar(u)){
            encaminharPagina("sucesso.jsp");
        } else {
            encaminharPagina("erro.jsp");
        }     
        }
    

    
}


Override
public String getServletInfo() {
    return "Short description";
}// </editor-fold>

private void encaminharPagina(String pagina) {
    try {
    RequestDispatcher rd = requisicao.getRequestDispatcher(pagina);
    rd.forward(requisicao, resposta);
    } catch (IOException | ServletException e) {
    System.out.println("erro no encaminhamento: " + e);
    }

}

}

classe de apoio ConexaoBD

package apoio;

import java.sql.;
import java.util.
;

public class ConexaoBD {

private static ConexaoBD instancia = null;
private Connection conexao = null;

public ConexaoBD() {
    try {
        // Carrega informações do arquivo de propriedades
        Properties prop = new Properties();
        
        prop.load(getClass().getClassLoader().getResourceAsStream("apoio/db.properties"));
        String dbdriver = prop.getProperty("db.driver");
        String dburl = prop.getProperty("db.url");
        String dbuser = prop.getProperty("db.user");
        String dbsenha = prop.getProperty("db.senha");

        // Carrega Driver do Banco de Dados
        Class.forName(dbdriver);

        if (dbuser.length() != 0) // conexão COM usuário e senha
        {
            conexao = DriverManager.getConnection(dburl, dbuser, dbsenha);
        } else // conexão SEM usuário e senha
        {
            conexao = DriverManager.getConnection(dburl);
        }

    } catch (Exception e) {
        System.err.println(e);
    }
}

// Retorna instancia
public static ConexaoBD getInstance() {
    if (instancia == null) {
        instancia = new ConexaoBD();
    }
    return instancia;
}

// Retorna conexão
public Connection getConnection() {
    if (conexao == null) {
        throw new RuntimeException("conexao==null");
    }
    return conexao;
}

// Efetua fechamento da conexão
public void shutDown() {
    try {
        conexao.close();
        instancia = null;
        conexao = null;
    } catch (Exception e) {
        System.err.println(e);
    }
}

}

classe Usuario

package entidade;

public class Usuario {

private int id;

private String nome;

private String senha;
public int getId(int id){
    return id;
}
public void setId(int ID){
    this.id = ID;
}
public String getNome(){
    return nome;
}
public void setNome(String NOME){
    this.nome = NOME;
}    
public String getSenha(){
    return senha;
}
public void setSenha(String SENHA){
    this.senha = SENHA;
}

}

classe LoginUsuarioDAO

package dao;

import apoio.ConexaoBD;

import entidade.Usuario;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

public class LoginUsuarioDAO {
public boolean Autenticar(Usuario u){

try {
        Statement st = ConexaoBD.getInstance().getConnection().createStatement();
       
        String sql =    "select count(nome) as encontrou from usuario" +
                        " where usuario.nome = "+ u.getNome() +
                        " and usuario.senha = " + u.getSenha();
                    
        ResultSet resultado = st.executeQuery(sql);
        
        while(resultado.next()){
            return 1 == resultado.getInt("encontrou");  //se retornar apenas 1 registro, será verdadeiro              
        }             
    } catch (SQLException ex) {
        System.out.println("Erro ao fazer login: " + ex);
        return false;
    }
    return false;    
}

}

texto em itálico

S

Código acima /\

L

Experimenta tirar as tags servlet e servlet-mapping (e tudo que tem dentro delas) do web.xml. Você já mapeou o servlet usando a annotation @WebServlet.

S

Tentei fazer isso e não resolveu @lvbarbosa

Depois de reinstalar o tomcat novamente recebo um erro diferente agora:

Root Cause

java.lang.RuntimeException: conexao == null

apoio.ConexaoBD.getConnection(ConexaoBD.java:49)

dao.ProdutoDAO.consultarProduto(ProdutoDAO.java:107)

org.apache.jsp.cadProduto_jsp._jspService(cadProduto_jsp.java:171)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

javax.servlet.http.HttpServlet.service(HttpServlet.java:741)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)

javax.servlet.http.HttpServlet.service(HttpServlet.java:741)

org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)
R

Manda o código da conexaoDB,

S

Segue

R

Nossa, mas não tem nenhum retorno de erro? Só quando fecha a conexão?

Eu faço desse jeito, se quiser adaptar pra vc, é até melhor

S

O erro é esse que te mandei mesmo, vou testar com esse teu código, imagino que para o postgre não muda nada além do driver, correto?

Uma pergunta besta, mas o antivirus pode influenciar no TomCat e bloquear ele de alguma forma? Única coisa que ainda não tentei foi desativar ele enquanto rodo

R

Então, é que na verdade esse não é o erro em si, é uma mensagem que você passou.

Pode ser que o erro seja nome de usuário inválido, senha inválida, url invalida, mas você só vê isso:

conexao == null

É um erro não tratado.


Pro Postgres muda a URL tbm:

public Statement stm;// responsável por preparar e realizar pesquisas no banco de dados

    public ResultSet rs;//  responsável por armazenar o resultado de uma pesquisa passada para o Statement
    private final String driver = "org.postgresql.Driver";// responsável por identificar o serviço de banco de dados
    private final String caminho = "jdbc:postgresql://localhost:5432/banco";// responsável por setar o local do banco de dados
    private final String usuario = "postgres";
    private final String senha = "senha";

    public Connection conn; // responsável por realizar a conexão com o banco de dados

    public void conexao() { //Metodo Responsável por realizar a conexão com o banco
        try {// tentativa inicial
            System.setProperty("jdbc.Driver", driver); // seta a propriedade do driver de conexão
            conn = DriverManager.getConnection(caminho, usuario, senha); // realiza a conexão com o banco de dados
            //JOptionPane.showMessageDialog (null, "Conectado com Sucesso ao Banco de Dados!"); // imprime uma caixa de mensagens
            //System.out.println("Conectado"); // imprime uma caixa de mensagens
        } catch (SQLException ex) { // excessão
             ex.printStacktrace();      Logger.getLogger(ConectaBanco.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void executaSQL(String sql) {
        try {
            stm = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
            rs = stm.executeQuery(sql);
        } catch (SQLException ex) {
            ex.printStacktrace();  
        }

    }

    public void desconecta() {//metodo para fechar a conexão com o banco de dados
        try {
            conn.close(); //fecha a conexão
            //JOptionPane.showMessageDialog (null, "Desconectado com Sucesso!"); // imprime uma caixa de mensagens
            //System.out.println("Desconectado");
            //System.out.println();
        } catch (SQLException ex) {
            ex.printStacktrace();  
        }

    }
R

Sobre o antivírus, não afeta não, senão o Tomcat nem iniciava!! O seu problema agora está na classe de conexão

R

Agora com essa classe que te passei, vc vai chamar assim:

ConectaBanco conecta = new ConectaBanco(); //global

public boolean autenticar(Usuario u){ //Nome de método sempre com camelcase, ou com underline, tipo autenticarLogin ou autenticar_login
    conecta.conexao();
    try {
        String sql =  "SELECT COUNT(nome) AS encontrou FROM usuario WHERE nome= '" + u.getNome() + "' AND senha= '" + u.getSenha() + "'";

        conecta.executaSQL(sql);
        while(conecta.rs.next()){
            return 1 == resultado.getInt("encontrou");  //se retornar apenas 1 registro, será verdadeiro              
        }             
    } catch (SQLException ex) {
        System.out.println("Erro ao fazer login: " + ex);
        return false;
    } finally {
        conecta.desconecta();
    }
    return false;    
}
S

Vou fazer um teste de meio dia e te retorno, muito obrigado pela ajuda

S

Implantei essas classes que tu enviou e recebo isso agora:

Exception
java.lang.NullPointerException apoio.ConectaBanco.desconecta(ConectaBanco.java:73) dao.LoginUsuarioDAO.Autenticar(LoginUsuarioDAO.java:28) servlets.acao3.doPost(acao3.java:69) javax.servlet.http.HttpServlet.service(HttpServlet.java:660) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)

R

Boa, tem mais alguns erros em cima desse aí, manda eles também

S

HTTP Status 500 – Internal Server Error

Type Exception Report

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

java.lang.NullPointerException

apoio.ConectaBanco.desconecta(ConectaBanco.java:73)

dao.LoginUsuarioDAO.Autenticar(LoginUsuarioDAO.java:28)

servlets.acao3.doPost(acao3.java:69)

javax.servlet.http.HttpServlet.service(HttpServlet.java:660)

javax.servlet.http.HttpServlet.service(HttpServlet.java:741)

org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)

Note A pilha de erros completa da causa principal está disponível nos logs do servidor.

Apache Tomcat/9.0.24

R

Mas você está vendo esse erro na saída da IDE ou no site?

R

Eu estava tendo os mesmos erros, quando fui na IDE (Netbeans) e vi na saída do projeto, haviam mais alguns erros acima, e lá mostrava onde estava o erro

S

No site, no server output vi agora um sqlexception
Error: java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/postgres

R

Boa garoto, agora é só você importar a biblioteca do Postgresql no seu projeto

S

Me explica melhor como faço isso?

R

Qual IDE vc esta usando?

S

NetBeans 11.1

R

Vai em bibliotecas, botão direito, adicionar biblioteca, procura algo relacionado a Postgresql

S

Importei mas persistem os erros:

Error: java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/postgres
Error: java.lang.NullPointerException

R

Aliás, o nome do seu banco de dados é postgres?

S

R

Mas você deixou a sua classe com esses properties? Faz do jeito que eu te passei

R

E o banco ‘postgres’, é um banco padrão. Não é o que vc criou…

Caminho = jdbc:postgresql://localhost:5432/Nome_do_seu_banco
S

Coloquei como public para ver, mas continua erro da mesma forma

R

public é o nome do schema…

Joga isso na classe de conexão e roda a Classe

public static void main (String[] args){
    new ConectaBanco().conexao();
}
S

Mudei de volta para postgres, joguei teu código dentro de ConectaBanco e continua o mesmo erro

R

Então cria um banco de dados, cria pelo postgres mesmo, e depois coloca o nome do banco de dados que vc criou lá no caminho

S

Criei o Banco:

Conectei no NetBeans:

URL da conexao na classe ConectaBanco:

private final String path = "jdbc:postgresql://localhost:5432/BancoDados";

E o erro persiste, uma coisa que notei é que ao fazer um select direto na tabela, o NetBeans gera a query dessa forma:

SELECT * FROM “schemaBD”.usuario LIMIT 100;

Então, tentei mudar a query dentro da classe LoginUsuarioDAO para:

String schema = “schemaBD”;
String sql = “SELECT COUNT(nome) AS encontrou FROM '”+schema+"’.usuario WHERE nome= ‘" + u.getNome() + "’ AND senha= ‘" + u.getSenha() + "’";

Mas infelizmente não mudou nada

R

Não precisa criar um schema novo, pode usar o public mesmo. Então o problema está na hora de colocar a biblioteca. Você chegou a configurar outra pasta de bibliotecas?

R
Solucao aceita

Olha, ve se algo te ajuda nesse link:

S

Não, só adicionei naquela hora que tu me falou para adicionar a biblioteca do PostGre

S

Cara, parou de dar o erro, mudei o method do form para o get e passei a chamada do LoginUsuarioDAO para o GET dentro do servlet e a página começou a carregar em branco.

Aí mudei redirecionamento de página para request.sendRedirect ao invés da função “encaminharPagina()” dentro do “if” e começou a carregar a página erro.jsp. Já é um avanço, antes nem isso fazia

Agora só falta descobrir porque não está validando o usuário, mas parece que o banco conectou pelo menos.

Obrigado por enquanto, se eu conseguir fazer autenticar eu coloco como resolvido aqui, Só achei estranho pelo Post não estar dando certo, pois literalmente copiei e colei o que tava no post dentro do get

S

Funcionou! Usando o method=“get” foi, mas além disso, copiei o .jar do postgre para o Libraries

R

Boa, creio que não aparecia o problema do get por conta da falta do driver. Mas que bom que funcionou!!

Criado 3 de setembro de 2019
Ultima resposta 5 de set. de 2019
Respostas 42
Participantes 3