Страница ошибки Whitelabel (тип = метод не разрешен, статус = 405)

Сообщение об ошибке:

Страница ошибки Whitelabel

Это приложение не имеет явного сопоставления для /error, поэтому вы рассматриваете это как запасной вариант.

Чт, 14 марта, 22:44:00 IST 2024 г. Произошла непредвиденная ошибка. (тип = метод не разрешен, статус = 405). Метод GET не поддерживается. org.springframework.web.HttpRequestMethodNotSupportedException: Метод запроса «GET» не поддерживается в org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:265) в org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:441) в org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:382) в org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal (RequestMappingInfoHandlerMapping.java:126) в org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal (RequestMappingInfoHandlerMapping.java:68) в org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:505) в org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1275) в org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) в org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974) в org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011) в org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) в jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) в org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) в jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205) в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) в org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) в org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) в org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) в org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) в org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) в org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) в org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) в org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:166) в org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) в org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) в org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) в org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) в org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) в org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341) в org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) в org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) в org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:894) в org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1740) в org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) в org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) в org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) в org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) в java.base/java.lang.Thread.run(Thread.java:1623)

Описание ошибки:

  • Я столкнулся с проблемой в части создания пользователя.

  • Это рабочий процесс приложения: Приветственная страница -> Список пользователей -> создать пользователя.

  • Даже если я упомянул метод POST в user_create.html, эта ошибка все равно отображается.

Как это решить?

Ниже приведена часть кодирования, связанная с этим.

Пользовательский контроллер:

package com.app.expensetracker.controller;
import com.app.expensetracker.dto.UserCreateRequest;
import com.app.expensetracker.entity.User;
import com.app.expensetracker.service.UserService;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

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

@Controller
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/user_list")
    public String getAllUsers(Model model) {
       model.addAttribute("user_list", userService.getAllUsers());
        return "user";

    }

    @PostMapping("/create")
    public  String createUser(@RequestBody @Valid UserCreateRequest userCreateRequest,Model model) throws Exception {
        model.addAttribute("user",userService.createUser(userCreateRequest));
        return "user_create";
    }

пользователь.html:

<!DOCTYPE html>
<html xmlns:th = "http://www.thymeleaf.org">
<head>
    <meta charset = "ISO-8859-1">
    <title>User</title>
    <link rel = "stylesheet"
          href = "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
          integrity = "sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm"
          crossorigin = "anonymous">
</head>
<body>

<div class  = "container">
    <div class = "row">
        <h1> User List </h1>
    </div>

    <div class = "row">
        <div class = "col-lg-3">
            <a th:href = "@{/user/create}" class = "btn btn-primary btn-sm mb-3"> Add User</a>
        </div>
    </div>
    <table class = "table table-striped table-bordered">
        <thead class = "table-dark">
        <tr>
            <th> First Name</th>
            <th> Last Name</th>
            <th> Categories</th>
            <th> Actions </th>
        </tr>
        </thead>

        <tbody>
        <tr th:each = "user: ${user_list}">
            <td th:text = "${user.firstName}"></td>
            <td th:text = "${user.lastName}"></td>
            <td th:text = "${user.categories}"></td>
            <td>
                <a th:href = "@{/user/update/{user_id}(user_id=${user.id})}"
                   class = "btn btn-primary">Update</a>

                <a th:href = "@{/user/delete/{user_id}(user_id=${user.id})}"
                   class = "btn btn-danger">Delete</a>

            </td>
        </tr>
        </tbody>

    </table>

</div>
</body>
</html>

user_create.html:

<!DOCTYPE html>
<html xmlns:th = "http://www.thymeleaf.org">
<head>
    <meta charset = "ISO-8859-1">
    <title>Add User</title>
    <link rel = "stylesheet"
          href = "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
          integrity = "sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm"
          crossorigin = "anonymous">
</head>
<body>

<br>
<br>
<div class = "container">
    <div class = "row">
        <div class  = "col-lg-6 col-md-6 col-sm-6 container justify-content-center card">
            <h1 class = "text-center"> Create New User </h1>
            <div class = "card-body">
                <form action = "/user/create" method = "POST">
                    <div class  = "form-group">
                        <label> First Name </label>
                        <input
                                type = "text"
                                name = "firstName"
                                th:field = "*{firstName}"
                                class = "form-control"
                                placeholder = "Enter User First Name"
                        />
                    </div>

                    <div class  = "form-group">
                        <label> Last Name </label>
                        <input
                                type = "text"
                                name = "lastName"
                                th:field = "*{lastName}"
                                class = "form-control"
                                placeholder = "Enter User Last Name"
                        />
                    </div>


                    <div class = "box-footer">
                        <button type = "submit" class = "btn btn-primary">
                            Submit
                        </button>
                    </div>
                </form>

            </div>
        </div>
    </div>
</div>
</body>
</html>

Не могли бы вы предоставить трассировку стека для этой ошибки?

Techguy 14.03.2024 18:50

Это потому, что вы определили кнопку, которая является гиперссылкой на /user/create. Когда вы нажимаете эту кнопку, он отправляет запрос GET к конечной точке, которую вы определили как POST.

lane.maxwell 14.03.2024 20:17

Это решило проблему. Спасибо @lane.maxwell

Giribala 15.03.2024 09:16
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
3
88
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Кажется, вы отправляете сообщение (не то, что говорит исключение, возможно, вы добавили часть «сообщение» позже) без тела. Поскольку вы не указали объект тела, который будет отправлен вместе с формой. Используя th:object

Посмотрите этот пример

    <!DOCTYPE html>
<html xmlns:th = "http://www.thymeleaf.org">
<head>
<title>Home Page</title>
<meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8"/>
</head>
<body>
    <h1>Hello world!</h1>
    <form action = "#" th:action = "@{/person}" th:object = "${person}" method = "post" >
        <input th:field = "*{firstName}" placeholder = "First Name" />
        <input th:field = "*{surname}" placeholder = "Last Name" />
        <button >Save</button>
    </form>
</body>
</html>

Я тоже это реализовал, но все равно получил ту же ошибку..... <form th:action = "/user/create" th:method = "POST" th:object = "${user}">

Giribala 15.03.2024 06:39
Ответ принят как подходящий

Обновлять

Спасибо @lane.maxwell в разделе комментариев за решение этой проблемы. В user.html кнопка добавления отправляет запрос GET к конечной точке, определенной как POST. Следовательно, я получил ошибку. Поэтому изменил эту кнопку, чтобы получить user_create.html. В user_create.html выполняется действие POST.

Это помогло мне устранить ошибку.

Другие вопросы по теме