@RequestMapping で複数のパス要素を使用する、可能な限り単純な Spring アプリケーションを作成しようとしています。たとえば、 /appcontext/blog/hello-world.html はリクエスト マッピングで機能するはずです (明らかに /appcontext は私のアプリケーションのコンテキストです)。
春はそのようなことをすることができますか?1つだけをマップすると、簡単に機能します。例えば:
@RequestMapping("hello-world")
動作し、 /hello-world.do 、 /anything/hello-world.do と一致しますが、私の問題は、hello-world が /blog パスにある場合にのみ一致させようとしていることです。
@RequestMapping("/blog/hello-world")
トリガーすることはありません。
サーバーログの例:
INFO: Mapped "{[/blog/hello],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String mainweb.BlogController.foo()
それはうまくいくように見えます(そして、私が持っている唯一のリクエストマッピングです)が、次のようになります:
WARNING: No mapping found for HTTP request with URI [/context/blog/hello.html] in DispatcherServlet with name 'dispatcher'
Spring はこのようなことを行うことができますか? すべてのリクエスト マッピングを / に入れたくありません。混乱するからです。
私が作業した唯一のマッピングは次のとおりです。
@RequestMapping("/**")
そこから、HttpServletRequest オブジェクトを直接見ることもできましたが、それでは @RequestMapping を使用することの要点がすべて無効になっているようです。
これが私のコントローラーです:
@Controller
public class BlogController {
private static final Logger LOG = Logger.getLogger(BlogController.class.getName());
@RequestMapping("/blog/hello")
public String foo1() {
LOG.info("foo1");
return "nothing";
}
@RequestMapping("/blog/hello.html")
public String foo2() {
LOG.info("foo2");
return "nothing";
}
@RequestMapping("/blog/hello.*")
public String foo3() {
LOG.info("foo3");
return "nothing";
}
@RequestMapping("/blog/**")
public String foo4() {
LOG.info("foo4");
return "nothing";
}
@RequestMapping("/blog/{path}")
public String foo5(@PathVariable String path) {
LOG.info("foo5 " + path);
return "nothing";
}
// added this as a test - it's the only way that this controller works
@RequestMapping("/**")
public String foo6() {
LOG.info("foo6");
return "nothing";
}
}
foo6 マッピングがない場合、どの URL にアクセスしても、何も機能しません。
そのコントローラーを使用すると、サーバー ログに次のように表示されます。
INFO: Mapped "{[/blog/hello],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String mainweb.BlogController.foo1()
INFO: Mapped "{[/blog/hello.html],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String mainweb.BlogController.foo2()
INFO: Mapped "{[/blog/hello.*],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String mainweb.BlogController.foo3()
INFO: Mapped "{[/blog/**],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String mainweb.BlogController.foo4()
INFO: Mapped "{[/blog/{path}],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String mainweb.BlogController.foo5(java.lang.String)
INFO: Mapped "{[/**],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String mainweb.BlogController.foo6()
しかし、繰り返しますが、入れた場合、foo6 以外は何もトリガーしません。
ありがとうございました!
編集:私は非常に単純なプロジェクトを作成しました。このプロジェクトには、1 つのクラス (Controller) と 1 つのメソッド (RequestMapping) しかありません。このプロジェクトは、機能しないこと以外は何もしません。@RequestMapping にワイルドカードを使用する以外のことをさせる方法はありません。これは、Spring の重大なバグのようです。すべてのドキュメントは、@RequestMapping が 1 つのワイルドカードをマップするだけではないと述べています。