5

Like the title says, I'm getting the Whitelabel 404 error page when trying to access localhost:8080.

Main class:

package com.michaelLong.studentaddressbook;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class StudentAddressBookApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {

        SpringApplication.run(StudentAddressBookApplication.class, args);
    }
}

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>com.michaelLong</groupId>
    <artifactId>student-address-book</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>student-address-book</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</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>
        </dependency>

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

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>

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

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

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>

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

</project>

Controller:

package controller;

import model.Student;
import model.StudentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.ui.Model;
import java.util.Map;

@Controller
public class StudentController {

    @Autowired
    StudentRepository studentRepository;

    @GetMapping("/")
    public String showStudents(Model model){
        model.addAttribute("students", studentRepository.findAll());
        return "showStudents";
    }
}

application.properties:

spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mysql://localhost:3306/StudentAddressBook
spring.datasource.username=root
spring.datasource.password=SQLpassword

showStudents.html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Student List</title>
</head>
<body>
<h2>List of students</h2>

<table>
    <tr>
        <th>Id</th>
        <th>First name</th>
        <th>Last name</th>
    </tr>
    <tr th:each="student: ${students}">
        <td th:text="${student.id}">Id</td>
        <td th:text="${student.firstName}">First name</td>
        <td th:text="${student.lastName}">Last name</td>
    </tr>

</table>
</body>
</html>

Project structure:

src
|__main
   |__java
   |  |__com.example.studentaddressbook
   |  |  |__StudentAddressBookApplication
   |  |__controller
   |  |  |__StudentController
   |  |__model
   |     |__Student
   |     |__StudentRepository
   |__resources
      |__static
      |__templates
      |  |__showStudents.html
      |__application.properties

I've tried looking at a lot of different tutorials, and a few SO posts like these: Spring Boot and Thymeleaf: Can't find HTML templates & Why the html page doesn't get showed in thymeleaf?

I was originally trying to use JSPs, but I couldn't get those to work either. I feel like I'm banging my head against the wall at this point and I'm not sure what else to do. This is my first time trying to use Spring Boot and Thymeleaf, so I'm having some difficulty figuring this out.

Any help trying to figure out why I can't access the HTML page would be greatly appreciated.

2
  • try to add spring.thymeleaf.cache=false in your properties file Commented Sep 25, 2018 at 19:48
  • Spring (Boot) is very "Convention over Configuration"-ish. Therefore move every managed class (Components, Services, ...) into the package or a sub-package of the "Main-class". That's the easy way. Sometimes that isn't possible or you simply want to do it "your way". You can do so but that requires configuration (@ComponentScan-annotation or XML-Configuration). Commented Sep 26, 2018 at 10:20

4 Answers 4

4

You have your StudentAddressBookApplication located in package "com.michaelLong.studentaddressbook" => it will scan only the beans from this parent package.

StudentController is located in package "controller" => the application will not scan it at all.

Very simple solution : move StudentController to package com.michaelLong.studentaddressbook. Also, the same applies for StudentRepository.

P.S packages in java are always lower case.

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you so much, this worked perfectly. I should have posted here earlier instead of running around in circles trying to find out what was happening. I'm just glad it was such a simple solution.
2

For those who are using Intellij, I had problem with Intellij run. After: ctrl+shift+a -> type: reimport... and select: "Reimport All Maven Projects". Made It working again.

Comments

1

Replacing common thymeleaf dependency by thymeleaf starter made the trick for me:

[Error]

implementation 'org.thymeleaf:thymeleaf:3.1.0.M1'

[Correct]:

implementation 'org.springframework.boot:spring-boot-starter-thymeleaf:2.6.7'

Comments

0

The problem is happening because of you project structure. Create package controller and model under com.example.studentaddressbook. Create project structure like this image. Let us know it it work

enter image description here

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.