3
respostas

Em desenvolvimento tudo bem, em produção gera 'Not Found'

Olá pessoal. Estou desenvolvendo um sistema em meu trabalho com Spring Boot 3.0.5 e banco de dados MySql 8.0.31. Em fase de desenvolvimento funciona tudo certinho (cadastro, requisições, alterações e deleção). Gerei o arquivo .war (com o comando 'mvn clean package') para inserir na hospedagem. Baixei o Tomcat em minha máquina local, inseri meu arquivo war na pasta webapps e executei o arquivo 'startup.bat' (inicia o Tomcat), ele sobe a aplicação corretamente sem erros aparentes no arquivo de log. No Insomnia ou diretamente no browser, ao digitar: 'localhost:8080' retorna a página inicial do Tomcat. Ao inserir localhost:8080/cafebeneficiado (meu endpoint no caso) ou localhost:8080/MinasCafe/cafebeneficiado (porque gerou o contexto 'MinasCafe' ao gerar o .war) retorna: 'HTTP Status 404 - Not Found. Detalhes: inseri no pom.xml <packaging>war</packaging> para empacotar em formato 'war' (formato de arquivo para implantação) e a dependencia:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

que executa o Tomcat integrado somente em tempo de desenvolvimento, a partir do empacotamento fica dependendo de um servidor externo. Inseri também na classe main a extensão:

public class MinasCafeApplication extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(MinasCafeApplication.class, args);
    }
}

( define como essa classe vai funcionar com um servidor externo a ele).

Alguém consegue me dar uma luz?

Meu pom.xml:

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <groupId>org.example</groupId>
    <artifactId>MinasCafe</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>MinasCafe</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
3 respostas

Meu application.properties:


#Configurações do JPA
spring.datasource.url=jdbc:mysql://localhost:3306/minas_cafe?createDatabaseIfNotExist=true

spring.datasource.username=root
#spring.datasource.password=Minas37331117
spring.datasource.password=359423

#Configurações do JPA
spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=true

#Porta de trabalho do Tomcat
server.port=8080

#Exibe os comandos SQL no console do IDE
spring.jpa.show-sql=true

#Quebra as linhas da consulta SQL no console para melhor visualização
spring.jpa.properties.hibernate.format_sql=true

#Especifica qual o banco de dados voce usará
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect

#spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#Enable spring data repos
spring.data.jpa.repositories.enable=true
spring.jpa.database=mysql

#Habilitando o arquivo de log
logging.file.name=logs/minas_cafe.log
logging.level.root=info

Meu controller:

@Autowired
    private CafeBeneficiadoRepository cafeBeneficiadoRepository; // Injetando o Repository como sendo um atributo

    @PostMapping
    @Transactional
    public ResponseEntity<String> cadastrar(@RequestBody @Valid DadosCadastroCafeBeneficiado cb) {
        cafeBeneficiadoRepository.save(new CafeBeneficiado(cb));

        System.out.println("Lote de café beneficiado salvo no banco com sucesso!");

        String responseMessage = "Lote de Café Beneficiado cadastrado com sucesso!";
        return ResponseEntity.ok(responseMessage);
    }

    @GetMapping // Listagem de Café Beneficiado
    public ResponseEntity<List<CafeBeneficiado>> listar() {
        List<CafeBeneficiado> caf = cafeBeneficiadoRepository.findAll();
        return ResponseEntity.ok().body(caf);
    }

    @GetMapping("/baixado") // listagem de Café Beneficiado deletado (inativo)
    public Page<DadosListagemCafeBeneficiado> Baixa(Pageable paginacao) {
        return cafeBeneficiadoRepository.findAllByAtivoFalse(paginacao).map(DadosListagemCafeBeneficiado::new);
    }

    @GetMapping("/{lote}") // listagem de lotes de Café Beneficiado "ativos"
    public ResponseEntity<List<CafeBeneficiado>> encontrar(@PathVariable int lote) {// No PathVariable o parâmetro é
                                                                                    // passado diretamente no corpo da
                                                                                    // requisição e esse valor faz parte
                                                                                    // do corpo da requisição
        List<CafeBeneficiado> ben = cafeBeneficiadoRepository.findByLoteAndAtivoTrue(lote);
        return ResponseEntity.ok().body(ben);
    }

    @GetMapping("/produtor/{produtor}")
    public ResponseEntity<List<CafeBeneficiado>> busca_produtor(@PathVariable String produtor) {
        List<CafeBeneficiado> caf = cafeBeneficiadoRepository.findByProdutor(produtor);
        return ResponseEntity.ok().body(caf);
    }

    @PutMapping
    @Transactional
    public void atualizar(@RequestBody @Valid DadosAtualizacaoCafeBeneficiado db) {
        var beneficiado = cafeBeneficiadoRepository.getReferenceById(db.lote());
        beneficiado.atualizarInformacoes(db);
    }
}

E aí! Beleza?

Olha, dei uma olhada no seu rolê com o Spring Boot 3.0.5 e MySql 8.0.31. Parece que a parada tá lisa no desenvolvimento, mas na hora de jogar pro Tomcat tá dando esse famoso "Not Found". Sacou?

Primeiro, confirmou se o contexto do Tomcat tá certinho? Tipo, você gerou o .war e subiu no Tomcat, mas a URL tá batendo mesmo com o contexto que você configurou no MinasCafe? Dá uma conferida nisso.

Segundo, notei que você tá usando o @RequestMapping na sua classe principal (MinasCafeApplication). Ficou esperto com isso aí, às vezes pode rolar uns conflitos, principalmente quando tá subindo em servidores externos.

Outra coisa, certifica que as dependências tão todas alinhadas. Vi que você tá usando o spring-boot-starter-tomcat com escopo provided. Tá ligado que isso significa que o Tomcat é providenciado pelo servidor onde tá rodando, né?

Ah, também lembra de checar se o Tomcat no seu servidor tá configurado pra ler .war. Às vezes, precisa dar um confere nas configurações do servidor pra garantir que ele tá pegando o .war certo.

Dá uma sacada nesses pontos e vê se resolve. Se continuar na vibe do "Not Found", a gente vai cavucando mais a fundo. Bora trocar essa ideia!