私はリファクタリングを実行し、コントローラーを2つのコントローラーに分割します。
@RequestMapping(value = "/graph.htm"、method = RequestMethod.POST、params = "first")
最初のコントローラーで:
@RequestMapping(value = "/graph.htm"、method = RequestMethod.POST、params = "second")
これらの注釈が異なるファイルにあるように、2番目のコントローラーにあります。プロジェクトをビルドして使用するときは、すべて問題ありません(入力HTMLタグをフォームに異なる名前(firstとsecond )で配置します)。
しかし、JUnitコントローラーテストを実行しようとすると、次のようになります。
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:test-context.xml"})
トレースを取得します:
原因:java.lang.IllegalStateException:ハンドラー'firstController'をマップできません URLパス[/graph.htm]へ:すでにハンドラーがあります タイプ[classcom.web.controller.SecondController]のマップ。 org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.registerHandler(AbstractUrlHandlerMapping.java:294)で org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.registerHandler(AbstractUrlHandlerMapping.java:266)で org.springframework.web.servlet.handler.AbstractDetectingUrlHandlerMapping.detectHandlers(AbstractDetectingUrlHandlerMapping.java:82)で org.springframework.web.servlet.handler.AbstractDetectingUrlHandlerMapping.initApplicationContext(AbstractDetectingUrlHandlerMapping.java:58)で org.springframework.context.support.ApplicationObjectSupport.initApplicationContext(ApplicationObjectSupport.java:119)で org.springframework.web.context.support.WebApplicationObjectSupport.initApplicationContext(WebApplicationObjectSupport.java:72)で org.springframework.context.support.ApplicationObjectSupport.setApplicationContext(ApplicationObjectSupport.java:73)で org.springframework.context.support.ApplicationContextAwareProcessor.invokeAwareInterfaces(ApplicationContextAwareProcessor.java:117)で org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:92)で org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:399)で org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479)で org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:524)で
私がこれをコメントアウトするとき:
@RequestMapping(value = "/graph.htm"、method = RequestMethod.POST、params = "second")
2番目のコントローラーでは、最初のコントローラーの個別テストが正常に完了しました。
この問題を解決するために、別のURL(@RequestMappingの値)を使用する場合がありますが、アプリケーションの本番ビルドでパラメーターのリクエストマッピングが解決され、SpringJUnit4ClassRunnerで失敗する理由がわかりません。
どんな助けでも歓迎します!
PS。Spring3.2を使用しています。
PPS。ほとんど同じ問題が見つかりました別のSpringコントローラーで異なるパラメーターを使用して同じマッピング値を使用できますか?しかし、回答によると、私の本番ビルドも失敗する必要がありますか?!しかし、私は本番ビルドを正常に実行します!!
以下も参照してください。
- renderメソッドに2つのパラメータがある@RequestMapping
- Spring MVC 3:一元化されたXML URLマッピングを使用した、異なるコントローラーでの同じ@RequestMapping(ハイブリッドxml /アノテーションアプローチ)
*PPS。
3.2の公式ドキュメントを確認します。
サーブレット環境では、パラメータマッピングは制限と見なされます タイプレベルで適用されます。プライマリパスマッピング(つまり、 指定されたURI値)は、ターゲットハンドラーを一意に識別する必要があります。 ハンドラーを呼び出すための前提条件を単に表現するパラメーターマッピング。
だから私は違法なコーディングの練習をしているようです...