java - Springboot提交未找到 Controller

标签 java spring spring-boot thymeleaf

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

    相关文章:

    java - Json 返回 3 个对象,而不是 java 中的一个?

    java - Xpages:OpenNTF ODA 日期出现问题

    java - 当IBM-JDK中jvm处于 Activity 状态时如何生成核心转储文件

    java - 如何解决错误 "package org.springframework.web.bind.annotation does not exist"

    java - 如何使用 Spring Boot 配置属性对属性进行分组

    java - 有没有办法在测试类之前重新加载 application.yml ?

    java - JAX-WS MTOM 流式传输 : server reads entire stream before sending

    java - 我可以在没有 Spring IoC 的情况下使用 Struts2 吗?

    spring - Spring Boot ElasticSearch端口

    spring - 如何防止更新时的 Spring 验证