2012-06-21 8 views
16

इम यह त्रुटि मिलती: HTTP Status 405 - Request method 'POST' not supportedHTTP स्थिति 405 अनुरोध 'POST' समर्थित नहीं (वसंत MVC)

मैं क्या करने की कोशिश कर रहा हूँ कि अन्य के आधार पर आबादी वाले हो ड्रॉप-डाउन बॉक्स के साथ एक फार्म बनाने के है मूल्य एक और ड्रॉप डाउन बॉक्स में चुना गया। उदाहरण के लिए जब मैं 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"; 
     } 

    } 

मैं इस त्रुटि को कैसे मिल आओ यहाँ मेरी कोड के प्रासंगिक भागों है? कोई भी सहायताकाफी प्रशंसनीय होगी! धन्यवाद

संपादित करें:hasCustomerName को hasId बदल दिया है। मुझे अभी भी HTTP Status 405 - Request method 'POST' not supported त्रुटि मिलती है।

EDIT2:setFalse समारोह में लाइन है कि त्रुटि

// डी

+1

मतदान क्यों करें? कृपया मुझे एक स्पष्टीकरण प्रदान करें ताकि मैं भविष्य में बेहतर प्रश्न पोस्ट कर सकूं। इस समस्या को मारने और इस पृष्ठ पर आने वाले लोगों के लिए धन्यवाद – dlinx90

+0

, यह भी जांचें कि परिभाषित कार्रवाई मौजूदा अंतराल को हिट करती है, यह मेरी समस्या थी :) –

उत्तर

3

करने के लिए लाइन

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

को बदलने की जरूरत हो सकती है।

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ö धन्यवाद!

3

समस्या यह है कि अपने नियंत्रक उम्मीद है पैदा कर रहा था बाहर टिप्पणी की एक पैरामीटर hasId = false या hasId = सच, लेकिन आप इसे पारित नहीं कर रहे हैं। आपके छिपे हुए फ़ील्ड में आईडी है ID लेकिन के रूप में पारित किया गया है कस्टमरनाम, इसलिए कोई मानचित्रण मिलान नहीं है।

या तो hasId या मानचित्रण पैरामीटर hasCustomerName = सच या hasCustomerName = false की उम्मीद करने के लिए छिपा क्षेत्र के रास्ते बदल जाते हैं।

+0

मुझे लगता है कि जब मैंने यह लिखा था तो मैं थोड़ा थक गया था। अच्छी नज़र! हालांकि मुझे अभी भी एक ही त्रुटि मिल रही है। इसके बारे में कुछ जानते हैं? – dlinx90

+1

त्रुटि संदेश कितना भ्रामक है? यह हमें लगता है कि यह एक HTTP क्रिया मुद्दा है जब वास्तव में यह एक पैरामीटर है। – Stephane

2

आप मैं समस्या यह है कि HTTP त्रुटि पैदा कर रहा था पाया

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

नहीं, प्रत्येक अनुरोध विधि के लिए दो विधियां हैं। –

11

चेक, अगर आप एक @ResponseBody या एक @ResponseStatus

लौट रहे हैं मैं एक ऐसी ही समस्या थी। मेरे नियंत्रक की तरह देखा:

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

जब एक पोस्ट अनुरोध मैं हमेशा निम्न त्रुटि मिल गया के साथ बुला:

HTTP स्थिति 405 - अनुरोध 'POST' समर्थित नहीं

थोड़ी देर के बाद मुझे पता चला कि विधि वास्तव में बुलाया गया था, लेकिन क्योंकि कोई @ResponseBody नहीं है और कोई @ResponseStatus स्प्रिंग एमवीसी त्रुटि उठाता है।

इस बस अपने पद्धति के लिए एक @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(); 
} 
14

मुझे यकीन नहीं है कि यह मदद करता है लेकिन मुझे एक ही समस्या थी।

आप सीएसआरएफ सुरक्षा के साथ springSecurityFilterChain का उपयोग कर रहे हैं। इसका मतलब है कि जब आप POST अनुरोध के माध्यम से कोई फॉर्म भेजते हैं तो आपको टोकन भेजना होगा। अपने फॉर्म में अगला इनपुट जोड़ने का प्रयास करें:

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

मुझे यह नहीं पता था, धन्यवाद। मेरे लिए काम किया – mgokgoz

+0

इस फिल्टर श्रृंखला को व्यवस्थित तरीके से कैसे अक्षम करें? क्योंकि बदलने के लिए कई तरीके हैं, मैं चाहता हूं कि यह पहले काम करता है, फिर धीरे-धीरे –

+0

@YuJiaao अपग्रेड करें - आप इसे वसंत सुरक्षा संदर्भ में देख सकते हैं, अध्याय 18.4.2 https://docs.spring.io/spring-security/site /docs/current/reference/html/csrf.html#csrf-configure –