2012-06-21 33 views
16

Im conseguir este error: HTTP Status 405 - Request method 'POST' not supportedHTTP 405 - Método de petición 'post' no está soportada (Spring MVC)

Lo que estoy tratando de hacer es hacer un formulario con un cuadro desplegable que son rellenados basa en la otra valor seleccionado en otro cuadro desplegable. Por ejemplo, cuando selecciono un nombre en el cuadro customerName, la función onChange en la página .jsp debe ejecutarse y la página enviada luego se vuelve a cargar con los valores correspondientes en el cuadro customerCountry.

Sin embargo, estoy obteniendo este error HTTP de estado 405. He buscado una solución en Internet pero no he podido encontrar nada que me haya ayudado. Aquí es las partes pertinentes de mi código:

parte de la página 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> 

parte del controlador:

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

    } 

¿Cómo es que sale este error? ¡Cualquier ayuda sería muy apreciada! Gracias

EDIT: Cambió hasId a hasCustomerName. Todavía recibo el error HTTP Status 405 - Request method 'POST' not supported.

Edit2: comentada la línea en la función de setFalse que estaba causando el error

// D

+1

¿Por qué votar abajo? Proporcione una explicación para poder publicar mejores preguntas en el futuro. Gracias – dlinx90

+0

para las personas que abordan este problema y que vienen en esta página, también verifican que la acción definida golpea un punto final existente, ese fue mi problema :) –

Respuesta

3

me encontré con el problema que estaba causando el error HTTP.

En la función setFalse() que se desencadena mediante el botón Guardar mi código intentaba enviar el formulario que contenía el botón.

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

cuando quito la document.submitForm.submit(); funciona:

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

@Roger Lindsjoë Gracias para observar mi error en el que no estaba de paso en el parámetro de la derecha!

3

El problema es que el controlador espera una Hasid parámetro = false o Hasid = verdadero, pero no estás pasando eso. Su campo oculto tiene el identificador hasId, pero se pasa como hasCustomerName, por lo que no coincide la asignación.

Cualquiera de cambiar la ruta del campo oculto a Hasid o el parámetro de mapeo para esperar hasCustomerName = true o hasCustomerName = false.

+0

Veo que estaba un poco cansado cuando escribí esto. ¡Buen ojo! Todavía estoy obteniendo exactamente el mismo error. ¿Alguna idea de lo que podría ser? – dlinx90

+1

¿Cómo es que el mensaje de error es tan engañoso? Nos lleva a pensar que es un problema del verbo HTTP cuando en realidad es un parámetro uno. – Stephane

2

Es posible que tenga que cambiar la línea

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

a

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

No, hay dos métodos, uno para cada RequestMethod. –

11

Comprobar si usted está volviendo un @ResponseBody o una @ResponseStatus

que tenía un problema similar. Mi controlador parecía que:

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

Al llamar con una solicitud POST siempre me dieron el siguiente error:

de estado HTTP 405 - Solicitud método 'post' no es compatible

Después de un tiempo Descubrí que el método se llamó en realidad, pero como no hay @ResponseBody ni @ResponseStatus Spring MVC provoca el error.

Para solucionar este sólo tiene que añadir un @ResponseBody

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

o una @ResponseStatus a su método.

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

No estoy seguro de si esto ayuda pero tuve el mismo problema.

Está utilizando springSecurityFilterChain con protección CSRF. Eso significa que debe enviar un token cuando envía un formulario a través de una solicitud POST. Intente agregar la siguiente entrada a su formulario:

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

No lo sabía, gracias. Funcionó para mí – mgokgoz

+0

¿Cómo desactivar esta cadena de filtro de forma moderada? porque tengo tantos métodos para cambiar, quiero que funcione primero, luego actualice gradualmente –

+0

@YuJiaao; puede encontrarlo en la referencia de Spring Security, capítulo 18.4.2 https://docs.spring.io/spring-security/site /docs/current/reference/html/csrf.html#csrf-configure –

Cuestiones relacionadas