Spring MVCコントローラー(バージョン3.0.2)でRequestMethod.PUT
およびRequestMethod.DELETE
を使用しようとしています。次のように、SpringコントローラークラスのURLにマップされた3つのメソッドがあります(PUT、GET、およびPOST、それぞれデモ目的のみ)。
@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";
}
ページがロードされると、GET
メソッドが明白に呼び出されますが、他のすべての場合(ページが送信されるとき)、呼び出されるメソッドはPOST
のみです。 RequestMethod.PUT
は呼び出されません。
Springフォームには、送信ボタンと画像ブラウザのみが含まれており、
<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>
生成されるHTMLは次のとおりです。
<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>
spring-config.xml
(私の場合はdispatcher-servlet.xml
)に、 CommonsMultipartResolver
への参照を追加しました:
<bean id="filterMultipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
そして、私のweb.xml
ファイルでは、 HiddenHttpMethodFilter
は次のように構成されています。
<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>
PUT
(およびDELETE
も)メソッドは呼び出されません(例外もエラーもありません)。ここに何が欠けていますか?
更新:
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>
次の例外をスローします。
org.springframework.beans.factory.NoSuchBeanDefinitionException:「filterMultipartResolver」という名前のBeanは定義されていません
名前dispatcher
はサーブレットの名前です-org.springframework.web.servlet.DispatcherServlet
は次のようにweb.xmlで既にマップされています。
<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>
他に何が必要かわかりませんか?フィルタは、 HiddenHttpMethodFilter
独自の拡張で実装する必要があります OncePerRequestFilter
示されているようなもの here ? (これは組み込みクラスです)
重要な点がリストされています こちら 。
ほとんどのブラウザは、HTMLフォームでaction=PUT
をサポートしていません。代わりにPOST
リクエストを送信します。 HiddenHttpMethodFilter は問題を回避するのに役立ちますが、フォームに非表示フィールド_method=PUT
を含める必要があります。 spring:form taglibを使用すると、これは自動的に行われますが、例ではプレーンHTMLを使用しているようです。
NoSuchBeanDefinitionException
は、おそらく無関係の問題です。
設定を変更する必要があります。
<servlet-name>/*</servlet-name>
に
<servlet-name>[dispatch servlet name]</servlet-name>