'spring boot doesn't shows custom error pages

I added spring-boot-starter-thymeleaf dependency to my project that using spring boot 2.3.1.RELEASE and placed error.html file inside src/main/resources/templates with name error.html and other custom error pages inside src/main/resources/templates/error` as you can see in below image:

Custom error page files

and add this configuration in application.yml:

server:
  error:
    whitelabel:
      enabled: false

and exclude ErrorMvcAutoConfiguration by add @SpringBootApplication(exclude = {ErrorMvcAutoConfiguration.class}) into Application class.

But, unfortunately i see this below page when error occurs, for example for 404 error!

404 error page

How can i solve this problem? i also googled for this but didn't find anything to help.



Solution 1:[1]

Try to use WebServerFactoryCustomizer:

@Configuration
public class WebConfig implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {

    @Override
    public void customize(ConfigurableServletWebServerFactory factory) {
        factory.addErrorPages(
                new ErrorPage(HttpStatus.FORBIDDEN, "/403"),
                new ErrorPage(HttpStatus.NOT_FOUND, "/404"),
                new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/500"));
    }
}

And ErrorController:

@Controller
public class ErrorController {

    @GetMapping("/403")
    public String forbidden(Model model) {
        return "error/403";
    }

    @GetMapping("/404")
    public String notFound(Model model) {
        return "error/404";
    }

    @GetMapping("/500")
    public String internal(Model model) {
        return "error/500";
    }

    @GetMapping("/access-denied")
    public String accessDenied() {
        return "error/access-denied";
    }
}

I have the same structure and it works for me:

enter image description here

Example: Customize the Error Messages

PS: in mine application.yml i don't have any properties for error handling

Solution 2:[2]

You don't need to exclude ErrorMvcAutoConfiguration. Simply put error pages to these places.

see also:

Solution 3:[3]

  1. add this configuration in application.yml/application.properties:

    • server.error.path=/error
  2. creat your error pages inder error path

    • error/400.html
    • error/500.html
    • error/error.html
  3. create class implements ErrorController:

    @Controller

    public class MyErrorController implements ErrorController {

    @RequestMapping("/error")
    

    public String handleError(HttpServletRequest request) {

     Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE); 
    
     if (status != null) {
         Integer statusCode = Integer.valueOf(status.toString());
    
         if(statusCode == HttpStatus.NOT_FOUND.value()) {
             return "/error/404";
         }
         else if(statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
             return "/error/500";
         }
     }
     return "/error/error";
    

    }

    }

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 DEWA Kazuyuki - ????
Solution 3 Sekrafi Abdallah