복붙노트

[SPRING] HTTP 상태 405 - 요청 메소드 'POST'가 지원되지 않음 (스프링 MVC)

SPRING

HTTP 상태 405 - 요청 메소드 'POST'가 지원되지 않음 (스프링 MVC)

이 오류가 발생했습니다. HTTP 상태 405 - 요청 방법 'POST'가 지원되지 않습니다.

내가 뭘 하려는지 다른 드롭 다운 상자에서 선택한 다른 값을 기반으로 채워진 드롭 다운 상자가있는 양식을 만드는 것입니다. 예를 들어 customerName 상자에서 이름을 선택하면 .jsp 페이지의 onChange 함수가 실행되고 제출 된 페이지가 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";
        }

    }

이 오류는 어떻게 발생합니까? 어떤 도움을 많이 주시면 감사하겠습니다! 감사

수정 : hasCustomerName hasId 변경되었습니다. 나는 여전히 HTTP 상태 405를 얻는다. 요청 방법 'POST'는 오류를 지원하지 않는다.

EDIT2 : 오류를 일으키는 setFalse 함수의 행을 주석 처리했습니다.

// D

해결법

  1. ==============================

    1.나는 이것이 도움이되는지 확실하지 않지만 같은 문제가있다.

    나는 이것이 도움이되는지 확실하지 않지만 같은 문제가있다.

    CSRF 보호 기능이있는 springSecurityFilterChain을 사용하고 있습니다. 즉, POST 요청을 통해 양식을 보낼 때 토큰을 보내야 함을 의미합니다. 양식에 다음 입력을 추가하십시오.

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

    2.@ResponseBody 또는 @ResponseStatus를 반환하는지 확인하십시오.

    @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가 없기 때문에 스프링 MVC는 오류를 발생시킵니다.

    이 문제를 해결하려면 @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();
    }
    
  3. ==============================

    3.라인을 변경해야 할 수도 있습니다.

    라인을 변경해야 할 수도 있습니다.

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

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

    4.문제는 컨트롤러가 hasId = false 또는 hasId = true 매개 변수를 기대하지만 사용자가이를 전달하지 않는다는 것입니다. 숨겨진 필드에는 hasId라는 id가 있지만 hasCustomerName으로 전달되므로 매핑이 일치하지 않습니다.

    문제는 컨트롤러가 hasId = false 또는 hasId = true 매개 변수를 기대하지만 사용자가이를 전달하지 않는다는 것입니다. 숨겨진 필드에는 hasId라는 id가 있지만 hasCustomerName으로 전달되므로 매핑이 일치하지 않습니다.

    숨겨진 필드의 경로를 hasId 또는 매핑 매개 변수로 변경하여 hasCustomerName = true 또는 hasCustomerName = false를 기대합니다.

  5. ==============================

    5.HTTP 오류의 원인이되는 문제점을 발견했습니다.

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

    @Roger Lindsjö 올바른 매개 변수를 전달하지 못한 곳에서 내 오류를 발견해 주셔서 감사합니다!

  6. from https://stackoverflow.com/questions/11145884/http-status-405-request-method-post-not-supported-spring-mvc by cc-by-sa and MIT license