Сообщение об ошибке:
Страница ошибки 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>
Это потому, что вы определили кнопку, которая является гиперссылкой на /user/create. Когда вы нажимаете эту кнопку, он отправляет запрос GET к конечной точке, которую вы определили как POST.
Это решило проблему. Спасибо @lane.maxwell






Кажется, вы отправляете сообщение (не то, что говорит исключение, возможно, вы добавили часть «сообщение» позже) без тела. Поскольку вы не указали объект тела, который будет отправлен вместе с формой. Используя 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}">
Спасибо @lane.maxwell в разделе комментариев за решение этой проблемы. В user.html кнопка добавления отправляет запрос GET к конечной точке, определенной как POST. Следовательно, я получил ошибку. Поэтому изменил эту кнопку, чтобы получить user_create.html. В user_create.html выполняется действие POST.
Это помогло мне устранить ошибку.
Не могли бы вы предоставить трассировку стека для этой ошибки?