Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

HTTP Status 404 – Not Found

Olá comunidade Alura!

Estou lutando contra esse erro mas até agora sem sucesso. Já vi todos os vídeos da Aula 01 e todas as questões relacionadas e nada me auxiliou a resolver.

Todo o código já foi montado para exibir a mensagem esperada e no entanto o browser revela a mensagem:

HTTP Status 404 – Not Found
Type Status Report

Message /casadocodigo/

Description The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.

O que já tentei para resolver:

  • Tentar versões diferentes do Tomcat (última v9.0 e a usada pelo instrutor v7.0.63)
  • Remover e recolocar o projeto no servidor.
  • Criar o projeto como Dynamic Web Project e convertê-lo para Maven.
  • Criar o projeto como Dynamic Web Project (usando a versão 2.2 do módulo) e convertê-lo para Maven.

Notei que o meu servidor não está registrando a mensagem de que o Servlet foi carregado, como a mensagem exibida no vídeo:

INFO: Initializing Spring FrameworkServlet 'dispatcher'

Por outro lado o meu log não apresenta nenhum erro ou warning.

Condição de execução:

Versão java:

thiago@udesk:~$ java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-8u252-b09-1~18.04-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)

Versão javac:

thiago@udesk:~$ javac -version
javac 1.8.0_252

Versão Eclipse:

Eclipse IDE for Java Developers
Version: 2019-12 (4.14.0)
Build id: 20191212-1212
OS: Linux, v.5.3.0-51-generic, x8

Versão Tomcat: 7.0.103

4 respostas

Log da inicialização do servidor

mai 04, 2020 8:34:24 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server version name:   Apache Tomcat/7.0.103
mai 04, 2020 8:34:24 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server built:          Mar 16 2020 08:34:15 UTC
mai 04, 2020 8:34:24 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server version number: 7.0.103.0
mai 04, 2020 8:34:24 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Name:               Linux
mai 04, 2020 8:34:24 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Version:            5.3.0-51-generic
mai 04, 2020 8:34:24 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Architecture:          amd64
mai 04, 2020 8:34:24 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Java Home:             /usr/lib/jvm/java-8-openjdk-amd64/jre
mai 04, 2020 8:34:24 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Version:           1.8.0_252-8u252-b09-1~18.04-b09
mai 04, 2020 8:34:24 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Vendor:            Private Build
mai 04, 2020 8:34:24 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_BASE:         /home/thiago/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1
mai 04, 2020 8:34:24 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_HOME:         /home/thiago/programas/apache-tomcat-7.0.103
mai 04, 2020 8:34:24 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.base=/home/thiago/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1
mai 04, 2020 8:34:24 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.home=/home/thiago/programas/apache-tomcat-7.0.103
mai 04, 2020 8:34:24 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dwtp.deploy=/home/thiago/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps
mai 04, 2020 8:34:24 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djava.endorsed.dirs=/home/thiago/programas/apache-tomcat-7.0.103/endorsed
mai 04, 2020 8:34:24 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dfile.encoding=UTF-8
mai 04, 2020 8:34:24 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/usr/java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib]
mai 04, 2020 8:34:24 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
mai 04, 2020 8:34:24 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 1541 ms
mai 04, 2020 8:34:24 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service [Catalina]
mai 04, 2020 8:34:24 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.103
mai 04, 2020 8:34:25 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
mai 04, 2020 8:34:25 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 1002 ms

Código fonte

package br.com.casadocodigo.loja.conf;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

import br.com.casadocodigo.loja.controllers.HomeController;

@EnableWebMvc
@ComponentScan(basePackageClasses={HomeController.class})
public class AppWebConfiguration {

    @Bean
    public InternalResourceViewResolver internalResourceViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WebContent/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

}
package br.com.casadocodigo.loja.conf;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class ServletSpringMvc extends AbstractAnnotationConfigDispatcherServletInitializer{

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { AppWebConfiguration.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] {"/"};
    }

}
package br.com.casadocodigo.loja.controllers;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HomeController {

    @RequestMapping("/")
    public String index() {
        System.out.println("Estamos dentro do controlador");

        return "home";
    }
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.casadocodigo</groupId>
  <artifactId>casadocodigo</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>war</packaging>
  <build>
    <finalName>casadocodigo</finalName>
  </build>

  <dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.1.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-servlet-api</artifactId>
        <version>7.0.30</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp.jstl</groupId>
        <artifactId>jstl-api</artifactId>
        <version>1.2</version>
        <exclusions>
            <exclusion>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>jstl-impl</artifactId>
        <version>1.2</version>
        <exclusions>
            <exclusion>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.6.1</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>1.6.1</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.6.1</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.16</version>
        <scope>runtime</scope>
    </dependency>
</dependencies>


  <properties>
    <failOnMissingWebXml>false</failOnMissingWebXml>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
</project>
solução!

Consegui resolver.

Acredito que minha solução represente um esforço muito grande para algo que poderia ter sido resolvido de forma bem mais simples, mas pela minha ignorância no uso e na integração das ferramentas hora estudadas acabou por ser a melhor forma que encontrei.

Em resumo a minha solução é uma viagem no tempo.

  • Instalei uma máquina virtual com Linux 14.04
  • Usei o eclipse mars 2
  • Usei o jboss forge 2.6 (Vi que no curso é usado o 2.16.2, mas não consegui encontrar essa versão).
  • Usei o tomcat 7.0.63, mesma versão usada pelo instrutor.
  • Usei o java 8, de forma mais especifica a versão 1.8.0_222

Se eu tivesse que apostar eu diria que o que fez a diferença foi a versão do eclipse e do tomcat, mas é apenas uma aposta.

A busca por uma solução demandou muitas horas que poderiam ter sido investidas no avanço e amadurecimento dos conteúdos do curso.

Percebo que a equipe Alura é muito comprometida com a qualidade do material fornecido. Deixo como sugestão que em algum local do curso seja registrado as versões que estão sendo utilizadas pelo instrutor de todos os componentes utilizados (SO, IDE, framework, bibliotecas, dependências e outros itens). Quanto mais velho o curso fica mais difícil fica reproduzir com precisão o que é passado pelo instrutor, uma prova disso é a quantidade de mensagens no fórum desse curso. Anotando-se as versões possibilitará uma reprodução o mais fiel possível.