Lucas_Camara 4 de jan. de 2023
Como o spring-boot vem com um tomcat embarcado, vc deve fazer algumas mudanças para poder rodar o projeto num tomcat externo. Siga os passos desse link: https://www.baeldung.com/spring-boot-war-tomcat-deploy
Vagner_Mocelin 4 de jan. de 2023 1 like
Obrigado Lucas! Pois é eu fiz essa mudanças também mas nao mudou nada, nao da erro na hora de complilar mas quando coloco no tomcat ele so dá erro 404. Tem alguma outra ideia?
Jonathan_Medeiros 4 de jan. de 2023
Aparentemente o 404 que você está recebendo é do próprio tomcat e não do Spring.
Seu contexto que foi configurado no tomcat é realmente o /master?
Vagner_Mocelin 4 de jan. de 2023
Oi Janthan, sim é /master, inclusive na ide funciona normal. Já tentei tudo quando é jeito e nada no tomcat
Lucas_Camara 4 de jan. de 2023
Tente também excluir o tomcat das dependências no pom.xml:
<dependencies>
<dependency>
<groupId> org.springframework.boot</groupId>
<artifactId> spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId> org.springframework.boot</groupId>
<artifactId> spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
Vagner_Mocelin 4 de jan. de 2023
Esse coloquei pra testar, estava sem, mas mesmo sem da esse erro
Jonathan_Medeiros 4 de jan. de 2023
Mas na IDE você está rodando direto a aplicação pelo servidor embedded ou você configurou um servidor externo?
Vagner_Mocelin 4 de jan. de 2023
pelo servidor embutido, estou usando o spring tools suit com o tomcat embutido nele
Jonathan_Medeiros 4 de jan. de 2023
Então por isso que na IDE funciona, o servidor embedded do Spring é auto configurado e pode ser modificado através dos arquivos de properties.
Algum motivo especial para você estar querendo gerar um artefato como .war e configurar um servidor na mão ao invés de disponibilizar sua aplicação como um .jar e utilizar o embedded tomcat?
Vagner_Mocelin 4 de jan. de 2023
é que já tem aqui na empresa um servidor com algumas aplicações que rodam em jsp, esse é meu primeiro projeto com spring, ai pensei em colocar junto. essas em jsp fiz usando o netbeans(não me zoa) e funcionaram de primeira.
Vagner_Mocelin 4 de jan. de 2023
as pliacaoes jsp sao em java 8 com tomcat 8.5, achei que fosse esse o problema já que a aplicacao em spring usa java 11, ai instalei o tomcat 11 mas nao adiantou, mesmo erro.
Jonathan_Medeiros 4 de jan. de 2023
Se você precisa obrigatoriamente colocar sua aplicação spring junto das demais que são jsp, e é algo relacionado ao seu trabalho, eu recomendaria você trocar uma ideia com as pessoas do seu time para pegar a base de configuração padrão do servidor e configurar sua aplicação spring da mesma forma que o tutorial que o @Lucas_Camara compartilhou.
Agora, se não é obrigatório usar o servidor de aplicação tomcat externo, eu não perderia tempo tentando colocá-lo na mesma estrutura que as demais aplicações jsp estão, utilizaria o próprio servidor embedded mesmo.
Vagner_Mocelin 4 de jan. de 2023
kkkk, é que as pessoas do meu time sou só eu kkkk, vou tentar gerar o jar com o servidor embedded e logo posto se deu certo.
Jonathan_Medeiros 4 de jan. de 2023
Bah, saquei, pensei que tinha mais pessoas no time!
Mano, nesse caso, se a decisão é sua e você tem autonomia para tomá-la, eu iria pelo caminho mais simples, de usar o tomcat embedded do spring e já ter essa aplicação totalmente apartada das aplicações legadas.
Vagner_Mocelin 4 de jan. de 2023
Tem razão Jonathan, passei um trabalho aqui pra desfazer as mudanças que tinha feito em relação ao .war mas estou enfrentando um problema parecido agora, a aplicação .jar executa, mas ao tentar acessar ela da esse erro:
Vagner_Mocelin 4 de jan. de 2023
package br . com . masterplastfitas . controller ;
import org.springframework.stereotype.Controller ;
import org.springframework.web.bind.annotation.GetMapping ;
@Controller
public class RotaIndexController {
@GetMapping ( "/" )
public String index () {
return "/index" ;
}
}
essa é a rota do index
Lucas_Camara 4 de jan. de 2023
O que vc está usando para fazer as telas?
Vagner_Mocelin 4 de jan. de 2023
Vagner_Mocelin 4 de jan. de 2023
Vagner_Mocelin 4 de jan. de 2023
O erro parece ser relacionado ao thymeleaf mas não sei como resolver, pela ide não dá esse erro.
Jonathan_Medeiros 4 de jan. de 2023
Seu controller está manipulando String pura, se você está utilizando thymeleaf você não deveria trabalhar com ModelAndView?
Vagner_Mocelin 4 de jan. de 2023
mas nao estou usando thymeleaf, apenas html, bootestrap e javascript, o que me deixa confuso é que na ide tudo funciona. “/index” deveria apontar para o index.html
Jonathan_Medeiros 5 de jan. de 2023
Mas se você não está usando thymeleaf o erro no console não faz sentido!
Lucas_Camara 5 de jan. de 2023
Em qual pasta no projeto vc está colocando suas páginas html?
Vagner_Mocelin 5 de jan. de 2023
estão na pasta templates (padrão)
Vagner_Mocelin 5 de jan. de 2023
Pois é, esse é meu primeiro projeto usando spring e to estudando sozinho, pode ser que tenha feito alguma config errada em relacão ao thymeleaf
Lucas_Camara 5 de jan. de 2023
Vc poderia postar uma dessas páginas pra gente ver?
Vagner_Mocelin 5 de jan. de 2023
claro, posso enviar o projeto também se precisar
Vagner_Mocelin 5 de jan. de 2023
<! DOCTYPE html >
< html lang = "pt-br" xmlns = "http://www.w3.org/1999/xhtml" xmlns : th = "https://www.thymeleaf.org"
xmlns : sec = "https://www.thymeleaf.org/thymeleaf-extras-springsecurity3" >
< head >
< meta charset = "utf-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1" >
< link rel = "icon" type = "image/png" sizes = "96x96" href = "assets/img/favicon.png" >
< title > Masterplast Indústria e Comércio de Plásticos Ltda </ title >
<!-- Google Font : Source Sans Pro -->
< link rel = "stylesheet"
href = "https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback" >
<!-- Font Awesome -->
< link rel = "stylesheet" href = "plugins/fontawesome-free/css/all.min.css" >
<!-- Theme style -->
< link rel = "stylesheet" href = "dist/css/adminlte.css" >
<!-- Daterange picker -->
< script type = "text/javascript" src = "https://cdn.jsdelivr.net/jquery/latest/jquery.min.js" ></ script >
<!-- home -->
< script type = "text/javascript" src = "dist/js/home.js" ></ script >
< script type = "text/javascript" src = "dist/js/usuario.js" ></ script >
< script type = "text/javascript" src = "dist/js/notificacao.js" ></ script >
< script type = "text/javascript" src = "dist/js/maquina.js" ></ script >
< script type = "text/javascript" src = "dist/js/moment.js" ></ script >
< script type = "text/javascript" src = "dist/js/links.maquinas.js" ></ script >
</ head >
< body class = "hold-transition sidebar-mini layout-fixed" >
< div class = "wrapper" >
<!-- Navbar -->
< nav class = "main-header navbar navbar-expand navbar-white navbar-light" >
<!-- Left navbar links -->
< ul class = "navbar-nav" id = "linkMaquinasAtivas" >
<!-- preenchido com jquery -->
</ ul >
<!-- Right navbar links -->
< ul class = "navbar-nav ml-auto" >
<!-- Navbar Search -->
< li class = "nav-item" >
< a class = "nav-link" data - widget = "navbar-search" href = "#" role = "button" >
< i class = "fa fa-search" ></ i >
</ a >
< div class = "navbar-search-block" >
< form class = "form-inline" >
< div class = "input-group input-group-sm" >
< input class = "form-control form-control-navbar" type = "search" placeholder = "Buscar"
aria - label = "Search" >
< div class = "input-group-append" >
< button class = "btn btn-navbar" type = "submit" >
< i class = "fa fa-search" ></ i >
</ button >
< button class = "btn btn-navbar" type = "button" data - widget = "navbar-search" >
< i class = "fa fa-times" ></ i >
</ button >
</ div >
</ div >
</ form >
</ div >
</ li >
<!-- Notifications Dropdown Menu -->
< li class = "nav-item dropdown" id = "notificacoes" >
<!-- preenchido com jquery -->
</ li >
<!-- User Dropdown Menu -->
< li class = "nav-item dropdown" >
< a class = "nav-link" data - toggle = "dropdown" href = "#" >
< i class = "fa fa-user" ></ i >< span id = "user" ></ span >
</ a >
< div class = "dropdown-menu dropdown-menu-lg dropdown-menu-right" >
< span class = "dropdown-header" > Opções </ span >
< div class = "dropdown-divider" ></ div >
< a href = "/master/trocarsenha" class = "dropdown-item" >
< i class = "fa fa-lock mr-2" ></ i > Trocar a Senha
</ a >
< div class = "dropdown-divider" ></ div >
< a href = "#" class = "dropdown-item" id = "sair" >
< form th : action = "@{/logout}" method = "post" id = "form" >
< i class = "fa fa-sign-out mr-2" ></ i > Sair
</ form >
</ a >
</ div >
</ li >
</ ul >
</ nav >
<!-- /. navbar -->
<!-- Main Sidebar Container -->
< aside class = "main-sidebar sidebar-dark-primary elevation-4" >
<!-- Brand Logo -->
< a href = "/master/home" class = "brand-link" >
< img src = "dist/img/user-medium.png" alt = "Masterplast Logo" class = "brand-image" style = "opacity: .8" >
< span class = "brand-text font-weight-light" > Masterplast </ span >
</ a >
<!-- Sidebar -->
< div class = "sidebar" id = "" >
<!-- SidebarSearch Form -->
< div class = "form-inline" >
< div class = "input-group" data - widget = "sidebar-search" >
< input class = "form-control form-control-sidebar" type = "search" placeholder = "Buscar"
aria - label = "Search" >
< div class = "input-group-append" >
< button class = "btn btn-sidebar" >
< i class = "fa fa-search fa-fw" ></ i >
</ button >
</ div >
</ div >
</ div >
<!-- Sidebar Menu -->
< nav class = "mt-2" >
< ul class = "nav nav-pills nav-sidebar flex-column"
data - widget = "treeview" role = "menu" data - accordion = "false" >
<!-- Add icons to the links using the . nav - icon class
with font - awesome or any other icon font library -->
< li class = "nav-header" > PRODUÇÃO </ li >
< li class = "nav-item" >< a href = "#" class = "nav-link" > < i
class = "nav-icon fa fa-desktop" ></ i >
< p >
Programação < i class = "right fa fa-angle-left" ></ i >
</ p >
</ a >
< ul class = "nav nav-treeview" >
< li class = "nav-item" >< a href = "programar"
class = "nav-link" > < i class = "fa fa-shopping-cart nav-icon" ></ i >
< p > Por Pedido </ p >
</ a ></ li >
< li class = "nav-item" >< a href = "sugeridos"
class = "nav-link" > < i class = "fa fa-bookmark nav-icon" ></ i >
< p > Itens Sugeridos </ p >
</ a ></ li >
< li class = "nav-item" >< a href = "reservas"
class = "nav-link" > < i class = "fa fa-archive nav-icon" ></ i >
< p > Reservas </ p >
</ a ></ li >
</ ul ></ li >
< li class = "nav-item" >< a href = "#" class = "nav-link" > < i
class = "nav-icon fa fa-industry" ></ i >
< p >
Produção < i class = "right fa fa-angle-left" ></ i >
</ p >
</ a >
< ul class = "nav nav-treeview" >
< li class = "nav-item" >< a href = "produzidos"
class = "nav-link" > < i class = "fa fa-circle nav-icon" ></ i >
< p > Produzidos </ p >
</ a ></ li >
< li class = "nav-item" >< a href = "conferidos"
class = "nav-link" > < i class = "fa fa-check nav-icon" ></ i >
< p > Conferidos </ p >
</ a ></ li >
< li class = "nav-item" >< a href = "lancados"
class = "nav-link" > < i class = "fa fa-rocket nav-icon" ></ i >
< p > Lancados </ p >
</ a ></ li >
</ ul ></ li >
< li class = "nav-item" >< a href = "#" class = "nav-link" > < i
class = "nav-icon fa fa-cogs" ></ i >
< p >
Máquinas < i class = "fa fa-angle-left right" ></ i >
</ p >
</ a >
< ul class = "nav nav-treeview" id = "menu_lateral_maquinas" >
<!-- preenchido com jquery -->
</ ul ></ li >
< li class = "nav-header" > LOGÍSTICA </ li >
< li class = "nav-item" >< a href = "#" class = "nav-link" > < i
class = "nav-icon fa fa-file" ></ i >
< p >
Acompanhamento < i class = "fa fa-angle-left right" ></ i >
</ p >
</ a >
< ul class = "nav nav-treeview" >
< li class = "nav-item" >< a href = "coletas" class = "nav-link" >
< i class = "fa fa-truck nav-icon" ></ i >
< p > Coletas </ p >
</ a ></ li >
</ ul ></ li >
< li class = "nav-header" > MATERIAIS </ li >
< li class = "nav-item" >< a href = "#" class = "nav-link" > < i
class = "nav-icon fa fa-file" ></ i >
< p >
Estoque < i class = "fa fa-angle-left right" ></ i >
</ p >
</ a >
< ul class = "nav nav-treeview" >
< li class = "nav-item" >< a href = "saldos" class = "nav-link" >
< i class = "fa fa-bars nav-icon" ></ i >
< p > Saldos </ p >
</ a ></ li >
</ ul ></ li >
< li class = "nav-header" > DIVERSOS </ li >
< li class = "nav-item" >< a href = "#" class = "nav-link" > < i
class = "nav-icon fa fa-edit" ></ i >
< p >
Cadastros < i class = "fa fa-angle-left right" ></ i >
</ p >
</ a >
< ul class = "nav nav-treeview" >
< li class = "nav-item" >< a href = "engenharia"
class = "nav-link" > < i class = "fa fa-list nav-icon" ></ i >
< p > Engenharia </ p >
</ a ></ li >
< li class = "nav-item" >< a href = "funcionarios"
class = "nav-link" > < i class = "fa fa-users nav-icon" ></ i >
< p > Funcionários </ p >
</ a ></ li >
< li class = "nav-item" >< a href = "impressoras"
class = "nav-link" > < i class = "fa fa-print nav-icon" ></ i >
< p > Impressoras </ p >
</ a ></ li >
< li class = "nav-item" >< a href = "maquinas"
class = "nav-link" > < i class = "fa fa-cogs nav-icon" ></ i >
< p > Máquinas </ p >
</ a ></ li >
< li class = "nav-item" >< a href = "bobinadeiras"
class = "nav-link" > < i class = "fa fa-cube nav-icon" ></ i >
< p > Bobinadeiras </ p >
</ a ></ li >
< li class = "nav-item" >< a href = "turnos" class = "nav-link" >
< i class = "fa fa-calendar nav-icon" ></ i >
< p > Turnos </ p >
</ a ></ li >
< li class = "nav-item" >< a href = "usuarios"
class = "nav-link" > < i class = "fa fa-user nav-icon" ></ i >
< p > Usuários </ p >
</ a ></ li >
</ ul ></ li >
</ ul >
</ nav >
<!-- /. sidebar - menu -->
</ div >
<!-- /. sidebar -->
</ aside >
<!-- Content Wrapper . Contains page content -->
< div class = "content-wrapper" >
<!-- Content Header ( Page header ) -->
< div class = "content-header" >
< div class = "container-fluid" >
< div class = "row mb-2" >
< div class = "col-sm-6" >
< h1 class = "m-0" > Resumo de hoje </ h1 >
</ div ><!-- /. col -->
</ div ><!-- /. row -->
</ div ><!-- /. container - fluid -->
</ div >
<!-- /. content - header -->
<!-- Main content -->
< div class = "content" >
< div class = "container-fluid" >
< div class = "row" >
< div class = "col-lg-3 col-6" >
<!-- small box -->
< div class = "small-box bg-info" >
< div class = "inner" >
< h3 id = "nroPedidosGeradosHoje" > 0 </ h3 >
< p > Pedidos Gerados Hoje </ p >
</ div >
< div class = "icon" >
< i class = "ion ion-bag" ></ i >
</ div >
<!--< a href = "#" class = "small-box-footer" > Mais detalhes < i
class = "fa fa-arrow-circle-o-right" ></ i ></ a >-->
</ div >
</ div >
<!-- ./ col -->
< div class = "col-lg-3 col-6" >
<!-- small box -->
< div class = "small-box bg-info" >
< div class = "inner" >
< h3 id = "valorVendidoHoje" > R $ 0 , 00 </ h3 >
< p > Vendido Hoje </ p >
</ div >
< div class = "icon" >
< i class = "ion ion-stats-bars" ></ i >
</ div >
<!--< a href = "#" class = "small-box-footer" > Mais detalhes < i
class = "fa fa-arrow-circle-o-right" ></ i ></ a >-->
</ div >
</ div >
<!-- ./ col -->
< div class = "col-lg-3 col-6" >
<!-- small box -->
< div class = "small-box bg-info" >
< div class = "inner" >
< h3 id = "valorFaturadoHoje" > R $ 0 , 00 </ h3 >
< p > Faturado Hoje </ p >
</ div >
< div class = "icon" >
< i class = "ion ion-person-add" ></ i >
</ div >
<!--< a href = "#" class = "small-box-footer" > Mais detalhes < i
class = "fa fa-arrow-circle-o-right" ></ i ></ a >-->
</ div >
</ div >
<!-- ./ col -->
< div class = "col-lg-3 col-6" >
<!-- small box -->
< div class = "small-box bg-info" >
< div class = "inner" >
< h3 id = "valorFaturadoMensal" > R $ 0 , 00 </ h3 >
< p > Faturado Mensal </ p >
</ div >
< div class = "icon" >
< i class = "ion ion-pie-graph" ></ i >
</ div >
<!--< a href = "#" class = "small-box-footer" > Mais detalhes < i
class = "fa fa-arrow-circle-o-right" ></ i ></ a >-->
</ div >
</ div >
<!-- ./ col -->
</ div >
<!-- /. row -->
< div class = "card" >
< div class = "card-header" >
< h3 class = "card-title" > Vendas recentes </ h3 >
< div class = "card-tools" >
< input type = "date" name = "data_pedidos" id = "data_pedidos" />
< button type = "button" class = "btn btn-primary btn-sm" onclick = "listaPedidosPorData()" >
< i class = "fa fa-search" ></ i >
</ button >
< button type = "button" class = "btn btn-primary btn-sm" data - card - widget = "collapse"
title = "Collapse" >
< i class = "fa fa-minus" ></ i >
</ button >
</ div >
</ div >
<!-- /. card - header -->
< div class = "card-body p-0" >
< table class = "table" id = "tabela_pedidos" >
< thead >
< tr >
< th > Pedido </ th >
< th > Un </ th >
< th > Cliente </ th >
< th > Vendedor </ th >
< th > Valor </ th >
< th > Data / Hora </ th >
< th > Faturamento </ th >
< th > Produção </ th >
< th > Logística </ th >
</ tr >
</ thead >
< tbody >
<!-- preenche com jquery -->
</ tbody >
</ table >
</ div >
<!-- /. card - body -->
</ div >
<!-- /. card -->
</ div ><!-- /. container - fluid -->
</ div >
<!-- /. content -->
</ div >
<!-- /. content - wrapper -->
<!-- Main Footer -->
< footer class = "main-footer" >
<!-- To the right -->
< div class = "float-right d-none d-sm-inline" >
Desenvolvido por Vagner Mocelin
</ div >
<!-- Default to the left -->
< strong > Copyright & copy ; 2003 - 2022 < a href = "https://www.masterplastfitas.com.br" > Masterplast </ a >.</ strong >
Todos os direitos reservados .
</ footer >
</ div >
<!-- ./ wrapper -->
<!-- REQUIRED SCRIPTS -->
<!-- jQuery -->
< script src = "plugins/jquery/jquery.min.js" ></ script >
<!-- Bootstrap 4 -->
< script src = "plugins/bootstrap/js/bootstrap.bundle.min.js" ></ script >
<!-- AdminLTE App -->
< script src = "dist/js/adminlte.min.js" ></ script >
<!-- Tempusdominus Bootstrap 4 -->
< script src = "plugins/tempusdominus-bootstrap-4/js/tempusdominus-bootstrap-4.min.js" ></ script >
<!-- Toastr -->
< script src = "plugins/toastr/toastr.min.js" ></ script >
</ body >
< script >
$ ( "#sair" ) . click ( function (){
form . submit ();
});
</ script >
< script >
$ ( window ) . on ( "load" , function () {
ContarSegundos ();
});
function ContarSegundos () {
carregaNotificacaoesNaoNotificadas ();
nroPedidosGeradosHoje ();
valorVendidoHoje ();
valorFaturadoHoje ();
valorFaturadoMensal ();
}
setInterval ( ContarSegundos , 10000 );
</ script >
< div class = "modal fade" id = "itens" >
< div class = "modal-dialog modal-lg" >
< div class = "modal-content" >
< div class = "modal-header" >
< h4 class = "modal-title" id = "titulo" ></ h4 >
< button type = "button" class = "close" data - dismiss = "modal"
aria - label = "Close" >
< span aria - hidden = "true" >& times ; </ span >
</ button >
</ div >
< div class = "modal-body" >
< table class = "table table-striped" id = "tabela_itens" >
< thead >
< tr >
< th > Item </ th >
< th > Código </ th >
< th > Descrição </ th >
< th > Quantia </ th >
</ tr >
</ thead >
< tbody >
<!-- preenche com jquery -->
</ tbody >
</ table >
</ div >
< div class = "modal-footer justify-content-between" >
< button type = "button" class = "btn btn-default" data - dismiss = "modal" > Fechar </ button >
</ div >
</ div >
<!-- /. modal - content -->
</ div >
<!-- /. modal - dialog -->
</ div >
<!-- /. modal -->
</ html >
Vagner_Mocelin 5 de jan. de 2023
Bem no começo cita o thymeleaf mas como foi gerado pela ide nao mexi, e rodando a aplicacao pela ide funciona perfeito.
Vagner_Mocelin 5 de jan. de 2023
tentei desativar o thymeleaf no application.properties mas ai ele retorna a string ao inves da pagina com esse nome
Solucao aceita
Vagner_Mocelin 5 de jan. de 2023 2 likes
Consegui!
O problema era realmente na rota:
estava assim:
package br . com . masterplastfitas . controller ;
import org.springframework.stereotype.Controller ;
import org.springframework.web.bind.annotation.GetMapping ;
import org.springframework.web.servlet.ModelAndView ;
@Controller
public class RotaHomeController {
@GetMapping ( "/home" )
public String index () {
return "/home" ;
}
}
ficou assim:
package br.com.masterplastfitas.controller ;
import org.springframework.stereotype.Controller ;
import org.springframework.web.bind.annotation.GetMapping ;
import org.springframework.web.servlet.ModelAndView ;
@Controller
public class RotaHomeController {
@GetMapping ( "/home" )
public ModelAndView home () {
return new ModelAndView ( "home" );
}
}
Muito obrigado @Jonathan_Medeiros e @Lucas_Camara