6

私はリファクタリングを実行し、コントローラーを2つのコントローラーに分割します。

@RequestMapping(value = "/graph.htm"、method = RequestMethod.POST、params = "first")

最初のコントローラーで:

@RequestMapping(value = "/graph.htm"、method = RequestMethod.POST、params = "second")

これらの注釈が異なるファイルにあるように、2番目のコントローラーにあります。プロジェクトをビルドして使用するときは、すべて問題ありません(入力HTMLタグをフォームに異なる名前(firstsecond )で配置します)。

しかし、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コントローラーで異なるパラメーターを使用して同じマッピング値を使用できますか?しかし、回答によると、私の本番ビルドも失敗する必要がありますか?!しかし、私は本番ビルドを正常に実行します!!

以下も参照してください。

*PPS

3.2の公式ドキュメントを確認します。

http://static.springsource.org/spring/docs/3.2.x/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html#params%28%29

サーブレット環境では、パラメータマッピングは制限と見なされます
タイプレベルで適用されます。プライマリパスマッピング(つまり、
指定されたURI値)は、ターゲットハンドラーを一意に識別する必要があります。
ハンドラーを呼び出すための前提条件を単に表現するパラメーターマッピング。

だから私は違法なコーディングの練習をしているようです...

4

2 に答える 2

3

これは、あなたの質問で引用された公式ドキュメントを読んだときに私が理解していることです:

サーブレット環境では、パラメータマッピングは、タイプレベルで適用される制限と見なされます。プライマリパスマッピング(つまり、指定されたURI値)は、クラス内のターゲットハンドラーを一意に識別する必要があります。パラメーターマッピングは、ハンドラーを呼び出すための前提条件を表すだけです。

「クラス内」という言葉を追加しました。

また、タイプレベルで強制されることに注意してください。私が理解しているように、それは:サーブレット環境で:を意味します。メソッドレベルでパラメータを宣言することは、タイプレベルでパラメータを宣言することとまったく同じです(少なくとも、クラスにメソッドが1つしかない場合)。

最後に、この文に注意を払うと(同じソース):

タイプレベルで使用される場合、すべてのメソッドレベルのマッピングはこのパラメーター制限を継承します(つまり、ハンドラーメソッドが解決される前にタイプレベルの制限がチェックされます)。

これはすべて、あなたが違法なコーディングをしていない理由を要約していると思います。

ユニットテストについて:

ここでも重要なのは、「サーブレット環境では。明らかに、単体テストを実行する場合:サーブレット環境ではないため、失敗する可能性があります。

于 2013-01-28T13:17:09.777 に答える
2

隣人の同僚がデバッグの問題を手伝ってくれました。

本番環境とテスト環境を比較し、コンテキストXML構成の違いを見つけました。

失敗した以前のテスト構成:

    <bean name = "handlerMapping"
          class = "org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
    <bean name = "handlerAdapter"
          class = "org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />

新しく機能するテストコンテキスト構成:

    <bean name = "handlerMapping"
          class = "org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
    <bean name = "handlerAdapter"
          class = "org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />

異なるSpringクラスは、異なるマッピングスキーマを使用します。クラスごとの古い使用、メソッドごとの新しい使用!!

于 2013-01-28T13:35:28.360 に答える