Spring Bootでエラーページの作成

# エラーページ
Spring BootではエラーページとしてWhitelable Error Pageが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520112/61aacc5a-3fe6-6dea-3b33-439fea305a2d.png)

GitHubの404エラーのページはこのように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520112/5054a7c5-1c0f-f86c-f390-882104fa5389.png)

エラーページを任意の表示に変更します。

# すべてのエラーページの変更
error.htmlを作成してエラーページを変更します。
```html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Error</title>
</head>
<body>
    <h1>An error occurred</h1>
</body>
</html>
```

任意のエラーページが表示されるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520112/4365091b-c7e5-0db8-eb35-8757d407a1ca.png)

この実装はすべてのエラーで、エラーページが同じ表示になります。

# エラーによってエラーページを変更
CustomErrorContollerを実装してエラーによって表示を変更します。
```java
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.HashMap;
import java.util.Map;

@Controller
public class CustomErrorController implements ErrorController {

    @RequestMapping("/error")
    public Object handleError(HttpServletRequest request) {
        Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
        String contentType = request.getContentType();

        if (contentType != null && contentType.contains(MediaType.APPLICATION_JSON_VALUE)) {
            return handleJsonError(status);
        }

        return handleHtmlError(status);
    }

    public ResponseEntity<Map<String, Object>> handleJsonError(Object status) {
        Map<String, Object> body = new HashMap<>();
        HttpStatus httpStatus;

        if (status != null) {
            int statusCode = Integer.parseInt(status.toString());

            switch (statusCode) {
                case 404:
                    body.put("message", "Bad Request");
                    httpStatus = HttpStatus.BAD_REQUEST;
                    break;
                default:
                    body.put("message", "An unexpected error occurred");
                    httpStatus = HttpStatus.INTERNAL_SERVER_ERROR;
                    break;
            }
        } else {
            body.put("message", "An unexpected error occurred");
            httpStatus = HttpStatus.INTERNAL_SERVER_ERROR;
        }

        return new ResponseEntity<>(body, httpStatus);
    }

    public String handleHtmlError(Object status) {
        String http;

        if (status != null) {
            int statusCode = Integer.parseInt(status.toString());

            switch (statusCode) {
                case 404:
                    http = "error/404";
                    break;
                default:
                    http = "error/error";
                    break;
            }
        } else {
            http = "error/error";
        }

        return http;
    }
}

```

先ほどのerror.htmlはerror/error.htmlへ移動させます。
404エラーのためのエラーページerror/404.htmlを作成します。
```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Error 404</title>
</head>
<body>
    <h1>Page not found</h1>
</body>
</html>
```

404エラーで任意のエラーページが表示されるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520112/ff2f6145-5a7f-88a3-54ab-1b0d6b63abf8.png)

# まとめ
デフォルトのエラーページから任意のエラーページを表示することが出来るようになりました。JSON形式でもエラーによって任意のエラーを返せるようにControllerを実装しましたが、動作確認は行っていません。動作確認後に追記しようと思います。