我只是在学习,一切都按照我正在观看的课程进行。但是,就我而言,服务器返回 HTTP 405 消息请求方法“POST”不支持。
问题:添加了“update”方法(一切都与@PostMapping注释一起工作):
package ru.first.spring.app.controllers;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import ru.first.spring.app.dao.PersonDAO;
import ru.first.spring.app.models.Person;
import javax.servlet.http.HttpServletRequest;
@Controller
@RequestMapping("/people")
public class PeopleController {
private final PersonDAO personDAO;
public PeopleController(PersonDAO personDAO) {
this.personDAO = personDAO;
}
@GetMapping()
public String index(Model model) {
model.addAttribute("people", personDAO.index());
return "people/index";
}
@GetMapping("/{id}")
public String show(@PathVariable int id, Model model) {
model.addAttribute("person", personDAO.show(id));
return "people/show";
}
@GetMapping("/new")
public String newPerson(@ModelAttribute("person") Person person) {
return "people/new";
}
@PostMapping()
public String create(@ModelAttribute Person person) {
personDAO.save(person);
return "redirect:/people";
}
@GetMapping("/{id}/edit")
public String edit(@PathVariable int id, Model model) {
model.addAttribute("person", personDAO.show(id));
return "people/edit";
}
@PatchMapping("/{id}")
public String update(@ModelAttribute Person person, @PathVariable int id) {
personDAO.update(id, person);
return "redirect:/people";
}
// @PostMapping("/{id}")
// public String update(@ModelAttribute Person person, @PathVariable int id) {
// personDAO.update(id, person);
// return "redirect:/people";
// }
}
为了使其发挥作用,课程作者说要添加 HiddenHttpMethodFilter():
package ru.first.spring.app.config;
import org.springframework.web.filter.HiddenHttpMethodFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
public class MySpringMvcDispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return null;
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {SpringConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[] {"/"};
}
@Override
public void onStartup(ServletContext aServletContext) throws ServletException {
super.onStartup(aServletContext);
registerHiddenFieldFilter(aServletContext);
}
private void registerHiddenFieldFilter(ServletContext aContext) {
aContext.addFilter("hiddenHttpMethodFilter",
new HiddenHttpMethodFilter()).addMappingForUrlPatterns(null ,true, "/*");
}
}
这是 edit.html,其中使用 thymeleaf 自动创建隐藏方法(在浏览器中检查 - 它有效):
<!DOCTYPE html>
<html lang="en" xmlns:th="http://thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Update person</title>
</head>
<body>
<form th:method="PATCH" th:action="@{/people/{id}(id=${person.getId()})}" th:object="${person}">
<label for="name">Enter name</label>
<input th:field="*{name}" type="text" id="name">
<br/>
<input type="submit" value="Edit person">
</form>
</body>
</html>
鉴于一切都适用于 @PostMapping 注释,我从逻辑上假设它是 HiddenHttpMethodFilter,但由于某种原因不起作用。
我检查了代码是否有错误、拼写错误等(因为在此之前,当我在 th:action 中设置错误的路径时,服务器抛出了类似的错误)。我确保应用程序可以使用 @PostMapping 注释正常工作。
通过用课程作者的 pom 替换你自己的,一切正常。 也许这是 spring. 版本,我想?不,只是通过更改版本我得到了同样的错误。 如果您更改版本并添加构建中缺少的所有内容?那也没用。只有完全替换我的pom.xml才解决问题
我的pom:
<?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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>spring.mvc.first.app</groupId>
<artifactId>firstSpringMVCApp</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>firstSpringMVCApp Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<spring.version>5.3.20</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf-spring5 -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>firstSpringMVCApp</finalName>
</build>
</project>
工作pom:
<?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>ru.alishev.springcourse</groupId>
<artifactId>spring-crud-app3</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>spring-mvc-app1 Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<spring.version>5.2.1.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>spring-mvc-app1</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
这很难称得上是问题的全面解决方案。我把它留在这里,如果你有类似的错误,也许编辑 pom 会对你有所帮助。