Spring Boot - Request method 'POST' not supported (Method not allowed)

17,336

Solution 1

I found the problem. My pom.xml was wrong. The right one looks like this:

<?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>org.springframework</groupId>
<artifactId>gs-handling-form-submission</artifactId>
<version>0.1.0</version>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.2.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
</dependencies>

<properties>
    <java.version>1.8</java.version>
</properties>


<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

<repositories>
    <repository>
        <id>spring-releases</id>
        <url>https://repo.spring.io/libs-release</url>
    </repository>
</repositories>
<pluginRepositories>
    <pluginRepository>
        <id>spring-releases</id>
        <url>https://repo.spring.io/libs-release</url>
    </pluginRepository>
</pluginRepositories>

Solution 2

I copied your exact same classes except the web security class and tried to run. The post method is working for me. The only change I made was returning file names without the .html extension.

My controller class looks like this

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.example.models.Information;

@Controller
@RequestMapping(value = "/info")
public class InformationController {

    @RequestMapping(method = RequestMethod.GET, produces = "text/html")
    public String infoForm(Model model) {

        model.addAttribute("information", new Information());
        return "infoForm";
    }

    @RequestMapping(method = RequestMethod.POST, produces = "text/html")
    public String infoSubmit(@ModelAttribute Information information) {
        return "infoResult";
    }
}
Share:
17,336
KnechtRootrecht
Author by

KnechtRootrecht

Updated on June 04, 2022

Comments

  • KnechtRootrecht
    KnechtRootrecht almost 2 years

    As I followed this tutorial: https://spring.io/guides/gs/handling-form-submission/ after a while I came to a dead end. I tried to figure out what the problem is for some hours now. I hope you can help me.

    When I submit my form, I get this error-message:

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

    My App (App.java):

    package de.poc.logging.main;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    @SpringBootApplication
    public class App {
      public static void main(String[] args) {
        SpringApplication.run(App.class, args);
      }
    }
    

    My Controller (InformationController.java):

    package de.poc.logging.main;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    @Controller
    @RequestMapping(value = "/info")
    public class InformationController {
      @RequestMapping(method = RequestMethod.GET, produces = "text/html")
      public String infoForm(Model model) {
        model.addAttribute("information", new Information());
        return "infoForm.html";
      }
    
      @RequestMapping(method = RequestMethod.POST, produces = "text/html")
      public String infoSubmit(@ModelAttribute Information information) {
        return "infoResult.html";
      }
    }
    

    I created an additional class for security (WebSecurityConf.java):

    package de.poc.logging.main.config;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    
    @Configuration
    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
      @Override
      protected void configure(HttpSecurity http) throws Exception {
        http.headers()
            .frameOptions().sameOrigin()
            .httpStrictTransportSecurity().disable();
        http.csrf().disable();
      }
    }
    

    And I have following two HTML-Files:

    infoForm.html:

        <!DOCTYPE HTML>
        <html xmlns:th="http://www.thymeleaf.org">
        <head>
            <title>Getting Started: Handling Form Submission</title>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        </head>
        <body>
        <h1>Form</h1>
        <form action="#" th:action="@{/info}" th:object="${information}" method="post">
            <p>Id: <input type="text" th:field="*{id}"/></p>
            <p>Message: <input type="text" th:field="*{content}"/></p>
            <p><input type="submit" value="Submit"/>
                <input type="reset" value="Reset"/></p>
            <!--<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>-->
        </form>
        </body>
        </html>
    

    infoResult.html:

    <!DOCTYPE HTML>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
        <title>Getting Started: Handling Form Submission</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    </head>
    <body>
    <h1>Result</h1>
    <p th:text="'id: ' + ${information.id}"/>
    <p th:text="'content: ' + ${information.content}"/>
    <a href="/info">Submit another message</a>
    </body>
    </html>
    

    Edit (additional information): my Information.java:

    package de.poc.logging.main;
    
    public class Information {
      private long id;
      private String content;
    
      public long getId() {
        return id;
      }
    
      public String getContent() {
        return content;
      }
    
      public void setId(long id) {
        this.id = id;
      }
    
      public void setContent(String content) {
        this.content = content;
      }
    
    }
    

    my pom-dependencies:

        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>1.5.2.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <version>1.5.2.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-security</artifactId>
                <version>1.5.2.RELEASE</version>
            </dependency>
        </dependencies>
    

    I'm using Java 1.8u121 (jdk).

    Edit2: I tried 3 different versions of spring boot now. Also I downloaded the project from here: https://github.com/spring-guides/gs-handling-form-submission and added spring boot via pom.xml. The downloaded project does not work for me.

    I'm getting really frustrated.