6

私のアプリケーションでは、Spring mvc が一貫して間違ったコントローラー メソッドを選択して実行する状況があります。以下のSpringからのデバッグログは問題を示しています.2つの一致が見つかります.1つはマッピングされているすべての未処理のマッピングコントローラーを処理する汎用目的のもので、もう1つはSpring mvc/api/**を探している実際のものであり、より具体的なハンドラーよりもハンドラーを選択します見つかった。api/companies/2/records/cabinets/FileTypes/50/1/api/**

Spring についての私の理解では、リクエスト マッピングに 2 つの一致がある場合、Spring は URL が長いハンドル メソッドを選択します。spring mvc が短いマッピングを選択するのはなぜですか?

次のマッピングがあるとします。

  • /api/companies/{id}/records/cabinets/FileTypes/{fileTypeId}/{versionId}method1 にマッピング
  • /api/**method2 にマッピング

そして、api/companies/2/records/cabinets/FileTypes/50/1上の 2 つの URL のハンドラー メソッドとして mvc pick をスプリングする必要があるパス。

デバッグ ログからの関連行を次に示します。

17:58:49,858 DEBUG [DispatcherServlet] DispatcherServlet with name 'main' processing PUT request for [/web/api/companies/2/records/cabinets/FileTypes/50/1]
17:58:49,858 TRACE [DispatcherServlet] Testing handler map [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping@2b25f2be] in DispatcherServlet with name 'main'
7:58:49,858 DEBUG [RequestMappingHandlerMapping] Looking up handler method for path /api/companies/2/records/cabinets/FileTypes/50/1
17:58:49,859 TRACE [RequestMappingHandlerMapping] Found 2 matching mapping(s) for [/api/companies/2/records/cabinets/FileTypes/50/1] : [{[/api/**],methods=[PUT],params=[],headers=[],consumes=[],produces=[],custom=[]}, {[/api/companies/{id}/records/cabinets/FileTypes/{fileTypeId}/{versionId}],methods=[PUT],params=[],headers=[],consumes=[],produces=[],custom=[]}]
4

2 に答える 2

7

これは確かにバグです (ここここを参照)。

マッピングでは、最初の式の括弧の数が考慮されていると思います。

/api/companies/{id}/records/cabinets/FileTypes/{fileTypeId}/{versionId}
               ^--                             ^--          ^--

最初の括弧 (パターン) が 3 つあり**、2 番目のパターン (

回避策:

as*とは同じように評価されます。次のよう/*に の代わりに 2 番目の式を作成してみてください。/api/**

/api/**/**/**/**

これには 4 つのパターンがあるため、他のパターンよりも「より一般的」になります。ただし、実際には、 と同等/api/**です。これにより、最後に評価されます。

このやや「簡単な」回避策が存在するため、バグが修正されるとしても、修正には時間がかかると思います。

于 2013-05-21T02:50:51.027 に答える
3

私はあなたが見ている行動を再現することができます. したがって、あなたの行動は2つのマッピングを使用しています:

./api/companies/{id}/records/cabinets/FileTypes/{fileTypeId}/{versionId}

./api/**

/api/companies/2/records/cabinets/FileTypes/50/12 番目のパスに一致する要求。

私は少し異なるパスを試しました:

./api/companies/{id}/records/cabinets/FileTypes

./api/**

へのリクエストで/api/companies/2/records/cabinets/FileTypes、今回は1番似合います!

これはバグだと思います。Spring JIRA サイトでチケットを提出することをお勧めします。

于 2013-05-21T01:11:32.750 に答える