当我在 HTML 表单上单击“提交”时,它没有到达/greeting 端点
@org.springframework.stereotype.Controller
@EnableAutoConfiguration
public class Controller {
@Autowired
assessment.PdfGeneratorUtil pdfGenaratorUtil;
@GetMapping ("/")
String home() {
return "static/assessment.html";
}
@PostMapping("/greeting")
public String greetingSubmit() {
Map<String,String> data = new HashMap<String,String>();
data.put("name","James");
thymeleaf 配置
@Configuration
public class TheymeLeafConfiguration {
@Bean
public ClassLoaderTemplateResolver emailTemplateResolver(){
ClassLoaderTemplateResolver emailTemplateResolver=new ClassLoaderTemplateResolver();
emailTemplateResolver.setPrefix("templates/");
emailTemplateResolver.setTemplateMode("HTML5");
emailTemplateResolver.setSuffix(".html");
emailTemplateResolver.setTemplateMode("XHTML");
emailTemplateResolver.setCharacterEncoding("UTF-8");
emailTemplateResolver.setOrder(1);
return emailTemplateResolver;
}
}
以及 html 的片段:
<form action="#" th:action="@{/greeting}" method="post">
当我提交表单时,不会到达 POST Controller 上的断点(与 map 相同的行),并且我在浏览器中收到 405:
There was an unexpected error (type=Method Not Allowed, status=405).
Request method 'POST' not supported
提交后浏览器中的URL为:
http://localhost:8080/assessment.html#
项目结构:
更新
它正在使用此代码,因为它命中了 Get Controller 方法,并且还命中了提交时的 Post Controller 方法。我不太确定发生了什么变化。
请注意,我此时没有使用 @ModelAttribute,因为我正在测试 Controller 方法是否在正确的时间被调用。
@GetMapping("/greeting")
String greetingForm() {
return "assessment";
}
@PostMapping("/greeting")
public String greetingSubmit() {
System.out.println(" HELLLOO HELLOOOO ");
Map<String,String> data = new HashMap<String,String>();
data.put("name","James");
try {
pdfGenaratorUtil.createPdf("greeting",data);
} catch (Exception e) {
e.printStackTrace();
}
return "finished";
}
最佳答案
根据您在代码中提供的最少详细信息,我将尝试回答您的问题。
- 我在您的代码中看到的第一个问题是您没有通过 postmapping 将任何值传递给方法,我认为这很奇怪,因为 post 用于创建静态资源。
因此,如果您想将从输入接收到的值映射到某些模型数据,则需要使用 @ModelAttribute 注释来完成。
@PostMapping("/greeting")
public String greetingSubmit(@ModelAttribute Greeting greeting) {
return "greeting";
}
- 检查是否找到您的模板网页。我没有看到任何页面映射来显示此提交的结果。 因此,您需要返回一些页面名称,浏览器将在其中转发表单提交的响应。所以如果你不添加它,spring会找到该方法,执行代码,但不知道重定向到哪里。在这种情况下,它也会显示 415 HttpStatus 代码。
所以添加如下内容:
return "greeting";
因此上面的代码将根据您的解析器配置查找 /templates/greeting.html
。
- 我假设您也在项目中使用了 spring security(屏幕截图中的假设。[class SecurityConfig。])
如果您使用 spring security,则在 spring-boot 中默认启用 CSRF 过滤器。因此,您需要禁用它或在登录表单发布请求中添加 csrf 参数。 (受到推崇的)。对于其余表单,CSRF token 将自动添加到具有隐藏输入的表单中。
禁用 CSRF:
在您的 spring securityConfig 中禁用 HttpSecurity 对象上的 csrf 保护,如下所示:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.formLogin()
.loginProcessingUrl("/authentication")
.usernameParameter("j_username")
.passwordParameter("j_password").permitAll()
.and()
.csrf().disable()
}
或者在您的登录表单中添加 csrf,如下所示:
input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
关于java - Springboot提交未找到 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50979953/