26 Stimmen

HTTP Status 405 - Anfragemethode 'POST' nicht unterstützt (Spring MVC)

Ich erhalte diesen Fehler: HTTP Status 405 - Request method 'POST' not supported

Was ich zu tun versuche, ist ein Formular mit einem Dropdown-Feld, das auf der Grundlage der anderen Wert in einem anderen Dropdown-Feld ausgewählt erhalten bevölkert zu machen. Wenn ich zum Beispiel einen Namen in der customerName Box die onChange Funktion in der .jsp-Seite sollte ausgeführt und die übermittelte Seite dann erneut mit den entsprechenden Werten in der customerCountry Box.

Ich erhalte jedoch die Fehlermeldung HTTP Status 405. Ich habe im Internet nach einer Lösung gesucht, aber nichts gefunden, was geholfen hat. Hier sind die relevanten Teile meines Codes:

Teil der jsp-Seite

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Insert title here</title>
            <style>
            .error { color: red; }
            </style>

        <script>
            function repopulate(){  
                document.deliveryForm.submit();
            }

            function setFalse(){
                document.getElementById("hasId").value ="false";
                document.deliveryForm.submit();
                // document.submitForm.submit(); (This was causing the error)

            }
        </script>

    </head>
    <body>

        <h1>Create New Delivery</h1>

        <c:url var="saveUrl" value="/test/delivery/add" />
        <form:form modelAttribute="deliveryDtoAttribute" method="POST" action="${saveUrl}" name="deliveryForm">
            <table>

                <tr>
                    <td><form:hidden id="hasId" path="hasCustomerName" value="true"/></td>
                </tr>

                <tr>
                    <td>Customer Name</td>
                    <td><form:select path="customerName" onChange="repopulate()">
                        <form:option value="" label="--- Select ---" />
                        <form:options items="${customerNameList}" />
                        </form:select>
                    </td>
                    <td><form:errors path="customerName" cssClass="error" /></td>
                </tr>

                <tr>
                    <td>Customer Country</td>
                    <td><form:select path="customerCountry">
                        <form:option value="" label="--- Select ---" />
                        <form:options items="${customerCountryList}" />
                        </form:select>
                    </td>
                    <td><form:errors path="customerCountry" cssClass="error" /></td>
                </tr>

        </form:form>

        <form:form name="submitForm">
        <input type="button" value="Save" onClick="setFalse()"/>
        </form:form>

    </body>
</html>

Teil des Controllers:

@RequestMapping(value = "/add", method = RequestMethod.GET)
    public String getDelivery(ModelMap model) {
        DeliveryDto deliveryDto = new DeliveryDto();

        model.addAttribute("deliveryDtoAttribute", deliveryDto);
        model.addAttribute("customerNameList",
                customerService.listAllCustomerNames());
        model.addAttribute("customerCountryList", customerService
                    .listAllCustomerCountries(deliveryDto.getCustomerName()));
        return "new-delivery";
    }

    // I want to enter this method if hasId=true which means that a value in the CustomerName 
    // drop down list was selected. This should set the CountryList to the corresponding values 
    // from the database. I want this post method to be triggered by the onChange in the jsp page

    @RequestMapping(value = "/add", method = RequestMethod.POST, params="hasCustomerName=true")
    public String postDelivery(
            @ModelAttribute("deliveryDtoAttribute") DeliveryDto deliveryDto,
            BindingResult result, ModelMap model) {

            model.addAttribute("deliveryDtoAttribute", deliveryDto);

            model.addAttribute("customerNameList",
                    customerService.listAllCustomerNames());
            model.addAttribute("customerCountryList", customerService
                    .listAllCustomerCountries(deliveryDto.getCustomerName()));

            return "new-delivery";
    }

    // This next post method should only be entered if the save button is hit in the jsp page

    @RequestMapping(value = "/add", method = RequestMethod.POST, params="hasCustomerName=false")
    public String postDelivery2(
            @ModelAttribute("deliveryDtoAttribute") @Valid DeliveryDto deliveryDto,
            BindingResult result, ModelMap model) {

        if (result.hasErrors()) {

            model.addAttribute("deliveryDtoAttribute", deliveryDto);

            model.addAttribute("customerNameList",
                    customerService.listAllCustomerNames());
            model.addAttribute("customerCountryList", customerService
                    .listAllCustomerCountries(deliveryDto.getCustomerName()));

            return "new-delivery";
        } else {

            Delivery delivery = new Delivery();

            //Setters to set delivery values

            return "redirect:/mis/home";
        }

    }

Wie kommt es, dass ich diese Fehlermeldung erhalte? Für jede Hilfe wäre ich sehr dankbar! Danke

EDITAR: Geändert hasId à hasCustomerName . Ich bekomme immer noch die HTTP Status 405 - Request method 'POST' not supported Fehler jedoch.

EDIT2: Auskommentiert wurde die Zeile in der setFalse Funktion, die den Fehler verursacht hat

// D

23voto

Ashish Punkte 392

Ich bin nicht sicher, ob das hilft, aber ich hatte das gleiche Problem.

Sie verwenden springSecurityFilterChain mit CSRF-Schutz. Das bedeutet, dass Sie ein Token senden müssen, wenn Sie ein Formular per POST-Anfrage senden. Versuchen Sie, die nächste Eingabe zu Ihrem Formular hinzuzufügen:

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>

19voto

RenRen Punkte 9430

Prüfen Sie, ob Sie einen @ResponseBody oder einen @ResponseStatus zurückgeben

Ich hatte ein ähnliches Problem. Mein Controller sah so aus:

@RequestMapping(value="/user", method = RequestMethod.POST)
public String updateUser(@RequestBody User user){
    return userService.updateUser(user).getId();
}

Beim Aufruf mit einer POST-Anforderung erhielt ich immer den folgenden Fehler:

HTTP Status 405 - Anfragemethode 'POST' nicht unterstützt

Nach einer Weile habe ich herausgefunden, dass die Methode tatsächlich aufgerufen wurde, aber weil es keinen @ResponseBody und keinen @ResponseStatus gibt, löst Spring MVC den Fehler aus.

Um dies zu beheben, fügen Sie einfach einen @ResponseBody

@RequestMapping(value="/user", method = RequestMethod.POST)
public @ResponseBody String updateUser(@RequestBody User user){
    return userService.updateUser(user).getId();
}

oder einen @ResponseStatus zu Ihrer Methode hinzufügen.

@RequestMapping(value="/user", method = RequestMethod.POST)
@ResponseStatus(value=HttpStatus.OK)
public String updateUser(@RequestBody User user){
    return userService.updateUser(user).getId();
}

5voto

harshit Punkte 7775

Möglicherweise müssen Sie die Zeile

@RequestMapping(value = "/add", method = RequestMethod.GET)

zu

@RequestMapping(value = "/add", method = {RequestMethod.GET,RequestMethod.POST})

4voto

Roger Lindsjö Punkte 11095

Das Problem ist, dass Ihr Controller einen Parameter erwartet hasId=false o hasId=true aber Sie werden das nicht tun. Ihr verstecktes Feld hat die id hasId sondern wird übergeben als hasCustomerName also keine Übereinstimmung mit der Zuordnung.

Ändern Sie entweder den Pfad des verborgenen Feldes in hasId oder den zu erwartenden Abbildungsparameter hasCustomerName=true o hasCustomerName=false .

3voto

dlinx90 Punkte 845

Ich habe das Problem gefunden, das den HTTP-Fehler verursacht hat.

In der setFalse() Funktion, die durch die Schaltfläche "Speichern" ausgelöst wird, hat mein Code versucht, das Formular, das die Schaltfläche enthält, zu übermitteln.

        function setFalse(){
            document.getElementById("hasId").value ="false";
            document.deliveryForm.submit();
            document.submitForm.submit();

wenn ich die document.submitForm.submit(); es funktioniert:

        function setFalse(){
            document.getElementById("hasId").value ="false";
            document.deliveryForm.submit()

@Roger Lindsjö Danke, dass Sie meinen Fehler entdeckt haben, bei dem ich nicht den richtigen Parameter weitergegeben habe!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X