Search code examples
springspring-bootmavenjspmessage

No message available JSP SpringBoot


I've been looking through almost every post that is related to my problem and tried every solution that i've found and this problem keeps appearing.

I'm developing a web application and i have almost all the pages that will include, but when i try to connect the Controllers with any JSP this messages appears every time, so i created a new project with only one table and a couple pages, and still get the same "error" but only with pages that load some information, i've tried with one very simple page and it works

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.

There was an unexpected error (type=Not Found, status=404). No message available

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 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>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>mjsl.gineco</groupId>
    <artifactId>GinecObstWeb</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>GinecObstWeb</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
     <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>org.eclipse.persistence.core</artifactId>
      <version>2.5.2</version>
     </dependency>
     <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>org.eclipse.persistence.asm</artifactId>
      <version>2.5.2</version>
     </dependency>
     <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>org.eclipse.persistence.antlr</artifactId>
      <version>2.5.2</version>
     </dependency>
     <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>org.eclipse.persistence.jpa</artifactId>
      <version>2.5.2</version>
     </dependency>
     <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>org.eclipse.persistence.jpa.jpql</artifactId>
      <version>2.5.2</version>
     </dependency>
     <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>javax.persistence</artifactId>
      <version>2.1.0</version>
     </dependency>
     <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId>
      <version>2.5.2</version>
      <scope>provided</scope>
     </dependency>

    <!-- standard.jar --> 
    <dependency>
        <groupId>taglibs</groupId>
        <artifactId>standard</artifactId>
        <version>1.1.2</version>
    </dependency>

    <!-- JSTL --> 
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.1.2</version>
    </dependency>         

        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>

    </dependencies>

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

</project>

application.properties

spring.datasource.url=jdbc:mysql://localhost:13366/ginecoweb?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=gineco
spring.datasource.password=Gineco-94.Aguila
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=none
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
spring.jpa.generate-ddl=false
spring.jpa.properties.hibernate.hbm2ddl.auto=none
spring.mvc.view.prefix: /WEB-INF/views/
spring.mvc.view.suffix: .jsp

Entity Clientes.java

package mjsl.gineco.entity;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import lombok.Data;

@Data
@Entity
@Table(name = "clientes")
public class Clientes implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Column(name = "CLAVCLI")
    private Integer clavCli;
    @Size(max = 100)
    @Column(name = "NOMBCLI")
    private String nombCli;
    @Size(max = 100)
    @Column(name = "DIRECLI")
    private String direCli;
    @Size(max = 50)
    @Column(name = "COLOCLI")
    private String coloCli;
    @Size(max = 50)
    @Column(name = "POBLCLI")
    private String poblCli;
    @Size(max = 30)
    @Column(name = "TELCLI")
    private String telCli;
    // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    @Column(name = "ESTACLI")
    private Double estaCli;
    @Size(max = 100)
    @Column(name = "OCUPCLI")
    private String ocupCli;
    @Size(max = 100)
    @Column(name = "NOCOCLI")
    private String nocoCli;
    @Size(max = 100)
    @Column(name = "OCCOCLI")
    private String occoCli;
    @Lob
    @Column(name = "EXPECLI")
    private byte[] expeCli;
    @Column(name = "FECHANACCli")
    @Temporal(TemporalType.DATE)
    private Date fechanacCli;
    @Size(max = 5)
    @Column(name = "GYRH")
    private String gyrhCli;
    @Column(name = "EMBARAZO")
    private Boolean embarazoCli;
    @Size(max = 50)
    @Column(name = "SEGUROCli")
    private String seguroCli;
    @Column(name = "NOSI")
    private Boolean nosiCli;
    @Size(max = 500)
    @Column(name = "FOTO")
    private String fotoCli;
    // @Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message="Invalid email")//if the field contains email address consider using this annotation to enforce field validation
    @Size(max = 200)
    @Column(name = "EMAIL")
    private String emailCli;

}

ClientesController

package mjsl.gineco.controller;

import java.util.List;
import mjsl.gineco.entity.Clientes;
import mjsl.gineco.service.ClientesService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ClientesController {

    @Autowired
    ClientesService ctesService;

    @RequestMapping("")
    public String inicio() {
        return "inicio";
    }

    @RequestMapping("listcte")
    public String listaCtes(Model model) {
        List<Clientes> clientes = ctesService.getAllCtes();
        model.addAttribute("clientList", clientes);
        return "indexpac";
    }

    @RequestMapping("newcte")
    public String nuevoCte(Model model) {
        Clientes clientes = new Clientes();
        model.addAttribute("clienteNuevo", clientes);
        return "nuevopac";
    }
}

ClientesRepository

package mjsl.gineco.repository;

import mjsl.gineco.entity.Clientes;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ClientesRepository extends JpaRepository<Clientes, Integer> {

}

ClientesService

package mjsl.gineco.service;

import java.util.List;
import java.util.Optional;
import mjsl.gineco.entity.Clientes;

public interface ClientesService {

    void saveCte(Clientes clientes);

    List<Clientes> getAllCtes();

    Optional<Clientes> getCte(Integer clavCli);

    void deleteCte(Integer clavCli);
}

ClientesServiceImpl

package mjsl.gineco.service;

import java.util.List;
import java.util.Optional;

import mjsl.gineco.entity.Clientes;
import mjsl.gineco.repository.ClientesRepository;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ClientesServiceImpl implements ClientesService {

    @Autowired
    ClientesRepository ctesRepo;

    @Override
    public void saveCte(Clientes clientes) {
        ctesRepo.save(clientes);
    }

    @Override
    public List<Clientes> getAllCtes() {
        return ctesRepo.findAll();
    }

    @Override
    public Optional<Clientes> getCte(Integer clavCli) {
        return ctesRepo.findById(clavCli);
    }

    @Override
    public void deleteCte(Integer clavCli) {
        ctesRepo.deleteById(clavCli);
    }

}

indexpac.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
  <head>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
        <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.0/css/all.css" integrity="sha384-lZN37f5QGtY3VHgisS14W3ExzMWZxybE1SJSEsQp9S+oqd12jhcu+A56Ebc1zFSJ" crossorigin="anonymous">
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>GinecoObstetricia Avanzada - Pacientes</title>
  </head>
  <body>
        <p><%@ include file="/WEB-INF/views/jspf/menu.jspf"%></p>
        <p></p>

        <div class="container-fluid">
            <div class="row-fluid">
                <div class="col-md-12">
                    <h4 class="text-center">Listado de Pacientes</h4>
                    <hr>
                    <a href="${pageContext.request.contextPath}/nuevopac" class="btn btn-success"><i class="glyphicon glyphicon-edit"></i> Nuevo(a) Paciente</a>
                    <div class="input-group mb-3">
                      <input type="text" class="form-control" placeholder="Buscar">
                      <div class="input-group-append">
                        <button class="btn btn-primary" type="submit">Ir</button> 
                      </div>
                    </div>
                    <p/>
                    <table class="table table-bordered table-striped">
                        <thead>
                        <tr>
                            <th>Id</th>
                            <th>Nombre</th>
                            <th>Teléfono</th>
                            <th>Ver</th>
                            <th>Expediente</th>
<!--                            <th>Eliminar</th>-->
                        </tr>
                        </thead>
                        <tbody>
                            <c:forEach var="clients" 
                                       items="${clientList}">
                                <c:url var="updateCteLink" value="/clientes/editapac">
                                    <c:param name="clavCli" value="${clients.clavCli}"/>
                                </c:url>
                                <c:url var="openCteLink" value="/clientes/datospac">
                                    <c:param name="clavCli" value="${clients.clavCli}"/>
                                </c:url>
                                <tr>
                                    <td>${clients.clavCli}</td>
                                    <td>${clients.nombCli}</td>
                                    <td>${clients.telCli}</td>
                                    <td>
                                        <a href="${updateCteLink}">
                                            <span class="fa-stack">
                                                <i class="far fa-edit" style="color:blue"> </i>
                                            </span>
                                        </a>
                                    </td>
                                    <td><a href="${openCteLink}">
                                            <span class="fa-stack">
                                                <i class="far fa-folder-open"> </i>
                                            </span>
                                        </a>
                                    </td>
<!--                                    <td>><a href="${pageContext.request.contextPath}/product/delete/${clients.clavCli}">
                                            <span class="fa-stack">
                                                <i class="far fa-trash-alt"> </i>
                                            </span>
                                        </a>
                                    </td>-->
                                </tr>
                            </c:forEach>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>


  </body>

        <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>  
</html>

menu.jspf

<%@ page pageEncoding="UTF-8" %>
<%!
    public String getPath(){
        String path = getServletContext().getContextPath();
        return path;
    }

%>

<nav class="navbar navbar-default navbar-fixed-top navbar-expand-md bg-light navbar-light">
  <div class="container-fluid">
    <!-- -->  
    <div class="navbar-header">
      <a class="navbar-brand" href="#">GinecoObstetricia</a>
    </div>
    <!-- -->  
      <div class="collapse navbar-collapse" id="navbarSupportedContent">
        <ul class="navbar-nav mr-auto">
            <li class="nav-item active">
              <a class="nav-link" href="<%=getPath()%>/index.jsp">Inicio <span class="sr-only">(current)</span></a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="<%=getPath()%>/login.jsp">Iniciar Sesión</a>
            </li>
            <li class="nav-item dropdown">
              <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                Pacientes
              </a>
              <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<!--                  <a class="dropdown-item" href="<%response.sendRedirect("indexpac");%>">Inicio</a>-->
                <a class="dropdown-item" href="<%=getPath()%>/indexpac.jsp">Inicio</a>
                <a class="dropdown-item" href="<%=getPath()%>/nuevopac.jsp">Agregar</a>
                <a class="dropdown-item" href="<%=getPath()%>/datospac.jsp">Expediente Médico</a>
                <a class="dropdown-item" href="<%=getPath()%>/datoscons.jsp">Consulta</a>
              </div>
            </li>
            <li class="nav-item dropdown">
              <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                Estudios
              </a>
              <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                <a class="dropdown-item" href="<%=getPath()%>/listadoest.jsp">Listado</a>
                <a class="dropdown-item" href="<%=getPath()%>/nuevoest.jsp">Nuevo</a>
              </div>
            </li>
            <li class="nav-item dropdown">
              <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                Agenda
              </a>
              <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                <a class="dropdown-item" href="<%=getPath()%>/index.jsp">Listado</a>
                <a class="dropdown-item" href="<%=getPath()%>/index.jsp">Nueva</a>
              </div>
            </li>
        </ul>
      </div>
  </div>
</nav>

nuevopac.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="mvc" %>

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
  <head>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>GinecoObstetricia Avanzada - Pacientes</title>
  </head>
  <body>
        <p><%@ include file="/WEB-INF/views/jspf/menu.jspf"%></p>
        <p></p>
         <div class="col-md-10 order-md-1">
            <mvc:form modelAttribute="clienteNuevo" action="createCte">
                <mvc:hidden path="clavCli" />
                <div class="input-group mb-3">
                    <div class="input-group-prepend">
                        <span class="input-group-text">Nombre</span>
                    </div>                
                    <mvc:input path="nombCli" type="text" class="form-control"/>
                </div>
                <div class="input-group mb-3">
                    <div class="input-group-prepend">
                        <span class="input-group-text">Fecha de Nacimiento</span>
                    </div>                
                    <mvc:input path="fechanacCli" type="date" class="form-control btn btn-outline-secondary col-md-3"/>
                    <div class="input-group-prepend">
                        <span class="input-group-text">Ocupación</span>
                    </div>                
                    <mvc:input path="ocupCli" type="text" class="form-control col-md-3"/>
                    <div class="input-group-prepend">
                        <span class="input-group-text">GyRH</span>
                    </div>                
                    <mvc:input path="gyrhCli" type="text" aria-labelledby="GyRH-ariaLabel" class="form-control col-md-3"/>
                    <div class="input-group-prepend">
                        <span class="input-group-text">Estatura</span>
                    </div>                
                        <mvc:input path="estaCli" type="text" class="form-control col-md-3"/>
                </div>
                <div class="input-group mb-3">
                    <div class="input-group-prepend">
                        <span class="input-group-text">Domicilio</span>
                    </div>                
                        <mvc:input path="direCli" type="text" class="form-control" placeholder="Calle y Número"/>
                        <mvc:input path="coloCli" type="text" class="form-control" placeholder="Colonia o Fraccionamiento"/>
                        <mvc:input path="poblCli" type="text" class="form-control" placeholder="Población"/>
                </div>
                <div class="input-group mb-3">
                    <div class="input-group-prepend">
                        <span class="input-group-text">Teléfono</span>
                    </div>                
                    <mvc:input path="telCli" type="text" class="form-control col-md-6"/>
                </div>
                <div class="input-group mb-3">
                    <div class="input-group-prepend">
                        <span class="input-group-text">Conyuge</span>
                    </div>                
                    <mvc:input path="nocoCli" type="text" placeholder="Nombre" class="form-control col-md-3"/>
                    <mvc:input path="occoCli" type="text" placeholder="Ocupación" class="form-control col-md-3"/>
                </div>
                <div class="input-group mb-3">
                    <div class="input-group-prepend">
                        <span class="input-group-text">Compañía de Seguros</span>
                    </div>                
                    <mvc:input path="seguroCli" type="text" placeholder="Nombre de la Compañía de Seguros" class="form-control col-md-6"/>
                </div>
                <div class="input-group mb-3">
                    <div class="input-group-prepend">
                        <span class="input-group-text">E-mail</span>
                    </div>                
                    <mvc:input path="emailCli" type="text" placeholder="Correo Electrónico" class="form-control col-md-6"/>
                </div>
                <div class="form-check-inline mb-3">
                    <label class="form-check-label">
                      <mvc:checkbox path="nosiCli" class="form-check-input" value=""/>Recomendada
                    </label>        
                </div>
                <div class="input-group mb-3">
                    <input type="submit" value="Guardar" class="btn btn-success">
                    <button type="button" class="btn btn-danger">Cancelar</button>
                </div>
            </mvc:form>
         </div>

        <!--<p style="text-align: center"><img src="Resources/logo_mrysi.png" align="bottom"/></p>-->
        <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>  
     </body>

</html>

Project Map

Project Map


Solution

  • Based on your Controller mapping when you hit

    localhost:8080/ => inicio page will load
    localhost:8080/listcte => indexpac page will load
    localhost:8080/newcte => nuevopac page will load
    

    Now let's see what you were trying

    localhost:8080/listado => will throw error page as no mapping is found for this URL in Controller class.

    localhost:8080/newcte => should load nuevopac page. Check console for error and please add nuevopac code. May be JSP throwing some error.