2013-01-21 51 views
6

私は2つの春のコントローラのマッピングを持っている:Spring MVCマッピングの優先順位を設定するにはどうすればよいですか?

@Controller 
public class ContentController { 

    @RequestMapping(value = "**/{content}.html") 
    public String content(@PathVariable String content, Model model, HttpServletRequest request) { 
    } 
} 

@Controller 
public class HomeController { 

    @RequestMapping(value = "**/home") 
    public String home(HttpServletRequest request, Model model) { 
    } 
} 

は、次のURLは、両方のマッピングに一致します。 /home.html

はしかし、私は「コンテンツ」のマッピングは常に "よりも優先されていることを確認したいですホームマッピング。私はそれを指定する方法はありますか?

+1

これらの2つのメソッドは、同じ.javaファイルにありますか? – sp00m

+0

独立したファイル。それを反映する質問を更新しました。 – JasonStoltz

+0

あなたのマッピングにこのような貪欲なパスを使用している理由はありますか? – dardo

答えて

0

URLマッピングは、マッピングが検出された順序によって決まります。

したがって、他のコントローラの後に1つのコントローラを強制的に作成することができます。

これは、bean定義(xml)のdepends-on = ""属性を使用して行うことができます。

最初に見つかったマッピングを使用するのか、最後のマッピングを使用するのかよくわかりません。

また、これは単なる理論であり、実際にはこれを試していません。

は、私はこのようなログメッセージを参照してください。

17:29:01.618 [main] INF S o.s.w.s.h.SimpleUrlHandlerMapping - Mapped URL path [/resources/**] onto handler 'org.springframework.web.servlet.resource.ResourceHttpRequestHandler#0' 
17:29:01.625 [main] INF S o.s.w.s.h.SimpleUrlHandlerMapping - Mapped URL path [/**] onto handler 'org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler#0' 

、それがどのように動作するかを確認するためにSimpleUrlHandlerMappingでLOKを持つので、価値があります。

+0

これを撮影する – JasonStoltz

+0

私はこれを試して、それは動作するように見えませんでした。私はそれがマッピングの特異性と関係していると推測しています...つまり、/ homeは{content} .htmlよりも具体的であると考えられますので、まず評価されます。とにかく愚かな編集:http://stackoverflow.com/questions/2326912/ordered-requestmapping-in-spring-mvc – JasonStoltz

+2

これが機能しても、私はそれが望ましい効果を持つとは思わない。 Springは常により具体的なマッピングを好むでしょう、と私は信じています。 – JasonStoltz

-2

このURL(/home.html)は、両方のマッピングに一致していません:それは接尾語 ".htmlを" を持っているので

@RequestMapping(value = "**/{content}.html") 
    ... 
    @RequestMapping(value = "**/home") 
    … 

それはちょうど最初のものと一致して!

+1

両方に一致します。 RequestMappingにはサフィックスは必要ありません。 – JasonStoltz

4

は私があいまいなURLの2種類に持っていた最近非常によく似た問題がありました。

  • 一つは、年間受け入れてましたが、私はこのような正規表現とのマッピングを使用して作成した/2012/2013などを言います: @RequestMapping("/{year:(?:19|20)\\d{2}}")
  • もう1人がコンテンツ識別子(別名スラグ)を受け入れていました。 @RequestMapping("/{slug}")のようなマッピングを使用して作成しました。

「年」コントローラメソッドが「スラグ」コントローラメソッドよりも優先されていたことが重要でした。残念なことに(私のために)Springは常に「スラグ」コントローラメソッドを使用していました。

Spring MVCのはより具体的なのマッピングを好むように、私は私の「スラッグ」パターン少ない特定をしなければなりませんでした。 Path Pattern Comparison文書に基づいて、私はスラグマッピングにワイルドカードを追加しました:@RequestMapping("/{slug}**")

私のコントローラは、そのように見て、今年(/2012/1998など)がURLのときに、今listByYearが呼び出されます。

@Controller 
public class ContentController 
{ 
    @RequestMapping(value = "/{slug}**") 
    public String content(@PathVariable("slug") final String slug) 
    { 
     return "content"; 
    } 
} 

@Controller 
public class IndexController 
{ 
    @RequestMapping("/{year:(?:19|20)\\d{2}}") 
    public String listByYear() 
    { 
     return "list"; 
    } 
} 

これは(私の意見では素晴らしい機能だろう)の優先順位を設定しますが、「素敵」の回避策のいくつかの並べ替えを与える方法を正確にではなく、中に便利かもしれません未来。

関連する問題