24

このエラーが発生しました:HTTP Status 405 - Request method 'POST' not supported

私がやろうとしているのは、別のドロップダウンボックスで選択された他の値に基づいて入力されるドロップダウンボックスを備えたフォームを作成することです。たとえば、customerNameボックスで名前を選択するonChangeと、.jspページの関数が実行され、送信されたページがボックス内の対応する値とともに再度読み込まれcustomerCountryます。

ただし、このHTTPステータス405エラーが発生します。私は解決策をインターネットで検索しましたが、役立つものを見つけることができませんでした。これが私のコードの関連部分です:

jspページの一部

<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>

コントローラーの一部:

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

    }

どうしてこのエラーが発生するのですか?どんな助けでも大歓迎です!ありがとう

編集:に変更hasIdされましたhasCustomerName。それでもHTTP Status 405 - Request method 'POST' not supportedエラーが発生します。

EDIT2:setFalseエラーの原因となった関数の行をコメントアウトしました

// D

4

7 に答える 7

22

これが役立つかどうかはわかりませんが、同じ問題がありました。

CSRF保護付きのspringSecurityFilterChainを使用しています。つまり、POSTリクエストを介してフォームを送信するときにトークンを送信する必要があります。フォームに次の入力を追加してみてください。

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
于 2015-08-11T15:07:24.053 に答える
17

@ResponseBodyまたは@ResponseStatusを返しているかどうかを確認します

私も同様の問題を抱えていました。私のコントローラーは次のようになりました。

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

POSTリクエストで呼び出すと、常に次のエラーが発生します。

HTTPステータス405-リクエストメソッド「POST」はサポートされていません

しばらくして、メソッドが実際に呼び出されたことがわかりましたが、@ ResponseBodyと@ResponseStatusがないため、SpringMVCでエラーが発生します。

これを修正するには、@ResponseBodyを追加するだけです。

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

またはメソッドへの@ResponseStatus。

@RequestMapping(value="/user", method = RequestMethod.POST)
@ResponseStatus(value=HttpStatus.OK)
public String updateUser(@RequestBody User user){
    return userService.updateUser(user).getId();
}
于 2015-02-24T20:53:37.937 に答える
5

行を変更する必要があるかもしれません

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

@RequestMapping(value = "/add", method = {RequestMethod.GET,RequestMethod.POST})
于 2012-06-21T22:21:34.653 に答える
4

問題は、コントローラーがパラメーターhasId=falseまたはhasId=trueを予期しているが、それを渡していないことです。非表示フィールドのIDはhasIdですが、hasCustomerNameとして渡されるため、マッピングは一致しません。

非表示フィールドのパスをhasIdに変更するか、マッピングパラメータを変更してhasCustomerName=trueまたはhasCustomerName=falseを期待します。

于 2012-06-21T21:02:23.380 に答える
3

HTTPエラーの原因となっている問題を見つけました。

[保存]ボタンによってトリガーされるsetFalse()関数で、私のコードはボタンを含むフォームを送信しようとしていました。

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

削除するdocument.submitForm.submit();と機能します:

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

@RogerLindsjö正しいパラメータを渡していないエラーを見つけてくれてありがとう!

于 2012-06-22T09:43:31.130 に答える
0

他の理由で同様の問題が発生してtest-response いました(csrfトークンにURLパターンが追加されていません):次のプロパティでURLパターンを許可することで解決しましたconfig/local.properties

csrf.allowed.url.patterns = /[^/]+(/[^?])+(sop-response)$,/[^/]+(/[^?])+(merchant_callback)$,/[^/]+(/[^?])+(hop-response)$

に変更

csrf.allowed.url.patterns = /[^/]+(/[^?])+(sop-response)$,/[^/]+(/[^?])+(merchant_callback)$,/[^/]+(/[^?])+(hop-response)$,/[^/]+(/[^?])+(test-response)$

于 2020-03-20T15:25:00.560 に答える
0

私の場合、URLは/で終わっていました

PaymentUrl(old)= / get-details /

末尾を削除しました/

paymentUrl(new)= / get-details

そしてそれはうまくいった

于 2022-02-07T19:57:51.050 に答える