9

これはよくある問題のようです。私はSOで与えられたすべての答えを出しましたが、それを機能させることができませんでした.
Spring MVC+Freemarker を既存の Web アプリケーションに統合しようとしています。リクエストに対しては正常に機能しGET、Freemarker テンプレートはコントローラーによって提供された Java オブジェクトを問題なく読み取ります。
ただし、フォームの送信は Controller メソッドにヒットできません。最後に、log4j を機能させました。ここに私が得ているエラーがあります:
エラー

    HandlerMethod details: 
    Controller [application.entry.controller.UserController]
    Method [public void application.entry.controller.UserController.handleSave(java.lang.String)]

    org.springframework.web.bind.MissingServletRequestParameterException: 
Required String parameter 'action' is not present


フリーマーカー:

<form method="POST" action="save.html">
  ------------
  <input type="submit" class="btnnew" name="saveWithoutValidation" value="Save Without Validation"></input>
  <input type="submit" class="btnnew" name="submit" value="Submit"></input>
</form>

context-root はPORTALです。
spring-servlet.xml

<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
      <property name="cache" value="true"/>
      <property name="prefix" value=""/>
      <property name="suffix" value=".ftl"/>

web.xml

<servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

コントローラ

@RequestMapping(value="/save", method=RequestMethod.POST)
    public void handleSave(@RequestParam String action){

        if( action.equals("submit") ){
            System.out.println("Damn! You clicked submit");
        }
        else if( action.equals("saveWithoutValidation") ){
           System.out.println("Sweet! You want no string attached.");
        }

    }

ログについてはlog4j.logger.org.springframework.web=DEBUG、既存の log4j.properties に追加しようとしましたが、うまくいきませんでした。

4

11 に答える 11

12

は、フォームに存在しないアクションという@RequestParam String action名前のパラメーターがリクエスト内に存在することを示唆しています。次のいずれかを行う必要があります。

  1. という名前のパラメーターを送信します。<input name="action" />
  2. 必要なパラメータを次のように設定しfalseます@RequestParam@RequestParam(required=false)
于 2013-07-22T19:25:13.083 に答える
12

私もこの問題を抱えていて、私の解決策は異なっていたので、同様の問題を抱えている人のためにここに追加してください。

私のコントローラーには次のものがありました:

@RequestMapping(value = "/setPassword", method = RequestMethod.POST)
public String setPassword(Model model, @RequestParameter SetPassword setPassword) {
    ...
}

@ModelAttribute問題は、これはではなく、オブジェクトに対するものであるべきだということでした@RequestParameter。このエラーメッセージは、質問で説明したものと同じです。

@RequestMapping(value = "/setPassword", method = RequestMethod.POST)
public String setPassword(Model model, @ModelAttribute SetPassword setPassword) {
    ...
}
于 2013-10-11T05:00:27.810 に答える
9

別の考えられる原因は、RequestMapping 属性の順序が間違っていることです。春のドキュメントが言うように:

@RequestMapping ハンドラー メソッドは、非常に柔軟なシグネチャを持つことができます。サポートされているメソッドの引数と戻り値については、次のセクションで説明します。ほとんどの引数は、BindingResult 引数を除いて、任意の順序で使用できます。これについては、次のセクションで説明します。

ドキュメントを下にスクロールすると、BindingResult はモデル属性の直後に配置する必要があることがわかります。これは、リクエストごとに複数のモデル オブジェクトを使用できるため、複数のバインディングを使用できるためです。

Errors または BindingResult パラメーターは、すぐにバインドされるモデル オブジェクトに従う必要があります。これは、メソッド シグネチャに複数のモデル オブジェクトが含まれている可能性があり、Spring がそれぞれのモデル オブジェクトに対して個別の BindingResult インスタンスを作成するため、次のサンプルが機能しないためです。

以下に 2 つの例を示します。

BindingResult と @ModelAttribute の順序が無効です。

@RequestMapping(method = RequestMethod.POST) public String processSubmit(@ModelAttribute("pet") Pet pet, Model model, BindingResult result) { ... } Pet と BindingResult の間に Model パラメータがあることに注意してください。これを機能させるには、次のようにパラメーターを並べ替える必要があります。

@RequestMapping(method = RequestMethod.POST) public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result, Model model) { ... }

于 2016-03-10T15:50:52.077 に答える
3

私は同様の問題に直面していましたが、値が正常に機能すると、日付のようないくつかのフィールドが具体的な値を取得していないことがわかりました。具体的な値が必要な日付やその他のフィールドがフォームに含まれていないことを確認してください。

于 2014-10-08T19:07:39.487 に答える
1

エラーに基づいて:

Required String parameter 'action' is not present

actionリクエストをハンドラにマップするには、Spring のリクエストに presentという名前のリクエスト パラメータが必要handleSaveです。

貼り付けた HTML には、そのようなパラメーターは表示されません。

于 2013-07-22T19:01:47.343 に答える
1

コントローラーは Bean で「アクション」値を見つけようとしていますが、あなたの例によれば、「アクション」の Bean 名を設定していません。name="action" を実行してみてください。@RequestParam は常に Bean クラスで検索されます。

于 2014-07-25T11:40:42.157 に答える
0

保管してください

<form method="POST" action="XYZ">

@RequestMapping(value="/XYZ", method=RequestMethod.POST)
    public void handleSave(@RequestParam String action){

@RequestMappingSpring MVC が解決できるように、フォーム アクション属性値は の値と一致する必要があります。

また、変更後404とのことでしたので、メソッド内に制御が入っているか確認していただけますでしょうかhandleSave()

メソッドから何も返していないので、それを見なければならないと思いますhandleSave()

それでもうまくいかない場合は、春のログを投稿してください。

また、リクエストが次のようになることを確認してください

/PORTAL/save

PORTAL/jsp/saveの言及のようなものの間に何かがある場合@RequestMapping(value="/jsp/save")

于 2013-07-22T17:27:16.760 に答える
0

リクエスト マッピングは です/saveが、POST は/save.htmlです。POST を変更する/saveと修正されます。

于 2013-07-22T17:15:13.410 に答える