2012-11-29 9 views
18

Ich versuche RequestMethod.PUT und RequestMethod.DELETE in Spring MVC Controller (Version 3.0.2) zu verwenden. Es gibt drei Methoden, die mit einer URL in der Spring-Controller-Klasse wie folgt zugeordnet werden (PUT, GET und POST jeweils nur für den Demonstrationszweck).Verwenden von PUT und DELETE-Methoden in Spring MVC

@RequestMapping(method = {RequestMethod.PUT}, value = {"admin_side/Temp"}, headers = {"content-type=multipart/form-data"}) 
public String update(@ModelAttribute("tempBean") TempBean tempBean, BindingResult error, Map model, HttpServletRequest request, HttpServletResponse response) { 
    if (ServletFileUpload.isMultipartContent(request)) { 
     System.out.println("true"); 
    } 

    System.out.println("Request method PUT"); 
    return "admin_side/Temp"; 
} 

@RequestMapping(method = {RequestMethod.GET}, value = {"admin_side/Temp"}) 
public String showForm(@ModelAttribute("tempBean") TempBean tempBean, BindingResult error, Map model, HttpServletRequest request, HttpServletResponse response) { 
    System.out.println("Request method GET"); 
    return "admin_side/Temp"; 
} 

@RequestMapping(method = {RequestMethod.POST}, value = {"admin_side/Temp"}) 
public String onSubmit(@ModelAttribute("tempBean") TempBean tempBean, BindingResult error, Map model, HttpServletRequest request, HttpServletResponse response) { 
    System.out.println("Request method POST"); 
    return "admin_side/Temp"; 
} 

Wenn die Seite geladen wird, ist POST die die GET Methode wird als offensichtlich aufgerufen, aber in allen anderen Fällen (wenn die Seite gestellt wird), die einzige Methode aufgerufen werden, ist das Verfahren, bezeichnet mit RequestMethod.PUT nie aufgerufen.


The Spring Formular enthält eine einzige Schaltfläche zum Senden und ein Bild-Browser wie

<form:form id="mainForm" 
      name="mainForm" 
      method="PUT" 
      action="Temp.htm" 
      enctype="multipart/form-data" 
      commandName="tempBean"> 

    <input type="file" id="myFile" name="myFile"/> 
    <input type="submit" id="btnSubmit" name="btnSubmit" value="Submit"/> 
</form:form> 

Der erzeugte HTML wird wie folgt

<form id="mainForm" 
     name="mainForm" 
     action="Temp.htm" 
     method="post" 
     enctype="multipart/form-data"> 

    <input type="hidden" name="_method" value="PUT"/> 
    <!--This hidden field is implicitly included--> 

    <input type="file" id="myFile" name="myFile"/> 
    <input type="submit" id="btnSubmit" name="btnSubmit" value="Submit"/> 
</form> 

In meinem spring-config.xml (dispatcher-servlet.xml in meinem Fall), Ich habe einen Verweis auf CommonsMultipartResolver hinzugefügt:

und in meiner web.xml Datei, HiddenHttpMethodFilter ist wie folgt konfiguriert,

<filter> 
    <filter-name>MultipartFilter</filter-name> 
    <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class> 
    <init-param> 
     <param-name>multipartResolverBeanName</param-name> 
     <param-value>filterMultipartResolver</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>MultipartFilter</filter-name> 
    <servlet-name>/*</servlet-name> 
</filter-mapping> 

<filter> 
    <filter-name>HiddenHttpMethodFilter</filter-name> 
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>HiddenHttpMethodFilter</filter-name> 
    <servlet-name>/*</servlet-name> 
</filter-mapping> 

Die PUT (und DELETE auch) Methode wird nie aufgerufen (ohne Ausnahme oder Fehler). Was fehlt mir hier?


Update:

Mit folgenden Konfiguration in web.xml,

<filter> 
    <filter-name>MultipartFilter</filter-name> 
    <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class> 
    <init-param> <!-- Makes no difference, if excluded. --> 
     <param-name>multipartResolverBeanName</param-name> 
     <param-value>filterMultipartResolver</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>MultipartFilter</filter-name> 
    <servlet-name>dispatcher</servlet-name> <!--Changed from /* to dispatcher--> 
</filter-mapping> 

<filter> 
    <filter-name>HiddenHttpMethodFilter</filter-name> 
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>HiddenHttpMethodFilter</filter-name> 
    <servlet-name>dispatcher</servlet-name> <!--Changed from /* to dispatcher--> 
</filter-mapping> 

es die folgende Ausnahme auslöst.

org.springframework.beans.factory.NoSuchBeanDefinitionException: Nein Bean mit dem Namen 'filterMultipartResolver' definiert ist

Wo der Name dispatcher ist der Name des Servlets - org.springframework.web.servlet.DispatcherServlet bereits in web.xml abgebildet wie folgt.

<servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>2</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>*.htm</url-pattern> 
</servlet-mapping> 

Ich bin mir nicht sicher, was sonst noch benötigt wird? Ist der Filter HiddenHttpMethodFilter erforderlich, um selbst zu implementieren, OncePerRequestFilter so etwas wie die gezeigte here zu implementieren? (es ist eine eingebaute Klasse)

Wichtige Punkte sind aufgeführt here.

Antwort

13

Die meisten Browser unterstützen action=PUT in HTML-Formularen nicht. Sie senden nur POST Anfragen stattdessen. Die HiddenHttpMethodFilter wird Ihnen helfen, das Problem zu umgehen, aber Sie müssen ein verstecktes Feld _method=PUT in Ihrem Formular einschließen.Wenn Sie die feder: form taglib verwenden, wird dies automatisch für Sie erledigt, aber Ihr Beispiel scheint HTML zu verwenden.

Die NoSuchBeanDefinitionException ist höchstwahrscheinlich ein nicht verwandtes Problem.

+1

ich diesen Tag-Bibliothek bin mit - ' ...' und das ausgeblendete Feld '" wird automatisch in das generierte HTML ** eingefügt, wie im zweiten und dritten Code-Snippet in der Frage gezeigt. Ich habe bereits so viele Beiträge auf dieser Website sowie andere Tutorials gesehen. Ich mache fast so, wie von ihnen beschrieben, obwohl das Ding in meinem Fall nicht funktioniert. Ich bin mir nicht sicher, was ich vermisse. Danke für die Antwort. – Tiny

+0

Entschuldigung, ich habe deinen Beitrag falsch gelesen ... mein Fehler. – Guillaume

+0

Ihr Text, "* Die NoSuchBeanDefinitionException ist höchstwahrscheinlich ein nicht verwandtes Problem *" ist korrekt. Das einzige Problem war, dass ich dieses 'org.springframework.web.multipart.commons.CommonsMultipartResolver' falsch konfiguriert und in eine falsche XML-Datei platziert hatte, anstatt es in' applicationContext.xml' zu platzieren. Daher verursachte es die Ausnahme. Es funktioniert jetzt und die Methode, die im Spring-Controller mit 'RequestMethod.PUT' gekennzeichnet ist, wird aufgerufen. Ein Problem besteht weiterhin darin, dass 'ServletFileUpload.isMultipartContent (request)' immer false zurückgibt. Es gibt nur bei 'POST' den Wert true zurück. Kennst du den Grund? – Tiny

1

Sie sollten Ihre Konfiguration ändern.

<servlet-name>/*</servlet-name> 

zu

<servlet-name>[dispatch servlet name]</servlet-name>