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, de acordo com a documentação: https://www.baeldung.com/spring-boot-war-tomcat-deploy
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 { …
( 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>
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);
}
}
O que pode haver de errado?