gpt4 book ai didi

java - Springboot提交未找到 Controller

转载 作者:行者123 更新时间:2023-12-02 02:04:48 27 4
gpt4 key购买 nike

当我在 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#

项目结构:

enter image description here

更新

它正在使用此代码,因为它命中了 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";
}

最佳答案

根据您在代码中提供的最少详细信息,我将尝试回答您的问题。

  1. 我在您的代码中看到的第一个问题是您没有通过 postmapping 将任何值传递给方法,我认为这很奇怪,因为 post 用于创建静态资源。

因此,如果您想将从输入接收到的值映射到某些模型数据,则需要使用 @ModelAttribute 注释来完成。

@PostMapping("/greeting")
public String greetingSubmit(@ModelAttribute Greeting greeting) {

return "greeting";
}

参见Spring boot form handling

  • 检查是否找到您的模板网页。我没有看到任何页面映射来显示此提交的结果。因此,您需要返回一些页面名称,浏览器将在其中转发表单提交的响应。所以如果你不添加它,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/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com