Springboot提交找不到控制器

时间:2018-06-22 02:46:23

标签: java spring spring-boot thymeleaf

当我单击HTML表单上的提交时,它没有达到/ greeting端点

 const imageData = await Image.query().where('product_id', product.id).fetch();
 const images = imageData.toJSON();

Thymeleaf配置

@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");

以及html的摘要:

 @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;
        }
    }

当我提交表单时,未在POST控制器上击中断点(与Map相同的行),并且在浏览器中得到405:

<form action="#" th:action="@{/greeting}" method="post">

提交后浏览器中的URL是:

There was an unexpected error (type=Method Not Allowed, status=405).
Request method 'POST' not supported

项目结构:

enter image description here

更新

它正在使用此代码,只要它命中了Get控制器方法,以及提交时的Post控制器方法。我不太确定发生了什么变化。

请注意,由于我正在测试是否在正确的时间调用了控制器方法,因此我目前未使用 @ModelAttribute

http://localhost:8080/assessment.html#

1 个答案:

答案 0 :(得分:2)

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

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

因此,如果要将从输入接收的值映射到某些模型数据,则需要使用 @ModelAttribute 批注进行。

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

    return "greeting";
}

请参见Spring boot form handling

  1. 检查是否找到您的模板网页。我没有看到任何页面映射来显示此提交的结果。 因此,您需要返回一些页面名称,您的浏览器将在其中转发表单提交的响应。因此,如果您不添加该代码,则spring会找到方法,执行代码,但不知道重定向到何处。在这种情况下,它也会显示 415 HttpStatus代码

因此添加如下内容:

    return "greeting";

因此,以上代码将根据您的解析器配置查找/templates/greeting.html

  1. 我假设您还在项目中使用spring安全性(来自屏幕截图的假设。[class SecurityConfig。]

如果使用spring安全性,则默认在spring-boot中启用CSRF过滤器。因此,您需要禁用它或在登录表单发布请求中添加csrf参数。 (推荐的)。对于其余表单,CSRF令牌将自动添加到具有隐藏输入的表单中。

要禁用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}" />