私はRequestMethod.PUT
とRequestMethod.DELETE
をSpring MVCコントローラ(バージョン3.0.2)で使用しようとしています。 SpringコントローラクラスのURLには、次のように3つのメソッドがマッピングされています(デモンストレーション目的の場合のみ、それぞれPUT、GET、POST)。Spring MVCでのPUTとDELETEメソッドの使用
@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
で指定されたメソッドは決してありません呼び出される。
春のフォームが
<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は、私の場合は私のspring-config.xml
(dispatcher-servlet.xml
で
<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>
、あります)、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>
(すぎとDELETE
)PUT
方法は、(例外またはエラーなしで)呼び出されることはありません。私はここで何が欠けていますか?
更新: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: -
org.springframework.web.servlet.DispatcherServlet
すでにweb.xmlにマッピングされた 'filterMultipartResolver' という名前はありません Beanは名前dispatcher
は、サーブレットの名前です
を定義しています次のように。
<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のようになりますか? (ビルトインクラス)
重要な点はhereです。
に私は、そのタグライブラリを使用しています"/>は、生成されたHTML **に自動的に含まれます(質問の2番目と3番目のコードスニペットに示されています)。私はすでにこのサイトの他のチュートリアルと同様に多くの投稿を見てきました。私の場合は、問題は機能しませんが、私は彼らの説明どおりにやっています。私は何が欠けているのか分からない。答えをありがとう。 – Tiny
申し訳ありませんが、あなたの投稿を間違えました...私の悪いです。 – Guillaume
あなたのテキストは、 "* NoSuchBeanDefinitionExceptionはおそらく無関係な問題です*"が正しいです。唯一の問題は、この 'org.springframework.web.multipart.commons.CommonsMultipartResolver'を誤って構成し、' applicationContext.xml'に配置するのではなく、間違ったXMLファイルに配置したことでした。したがって、例外が発生していました。これで動作し、Springコントローラで 'RequestMethod.PUT'で指定されたメソッドが呼び出されます。それでも 'ServletFileUpload.isMultipartContent(request)'が常にfalseを返すという問題が残っています。これは 'POST'でのみtrueを返します。理由を知っていますか? – Tiny