0

@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 つのワイルドカードをマップするだけではないと述べています。

4

2 に答える 2

0

理解した。サーブレット マッピングは、パスの一部を切り落とします! サーブレット マッピングは、基本的にミニ コンテキストを作成します。私はそれがそれをしたことを知りませんでした、そしてそれは直感的に明らかではありませんが、それが起こっていることです.

于 2013-11-06T18:18:32.280 に答える