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.
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
Entschuldigung, ich habe deinen Beitrag falsch gelesen ... mein Fehler. – Guillaume
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