当前位置: 首页 > 知识库问答 >
问题:

具有多个路径元素的RequestMapping

梁鸣
2023-03-14

Spring能做那样的事吗?当它只映射一件事时,我让它很容易工作。例如:

@RequestMapping(“Hello-World”)

工作并将匹配/hello-world.do,/anything/hello-world.do,但我的问题是,如果hello-world位于/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("/**")
@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";
    }
}
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()

谢谢!

编辑:我创建了一个非常简单的项目,它只有一个类Controller,一个方法RequestMapping。这个项目除了不起作用之外什么也不做。除了使用通配符之外,根本没有办法让@RequestMapping做任何事情。这似乎是Spring的一个关键错误;所有的文档都说@RequestMapping不仅仅是映射一个通配符。

共有1个答案

张建华
2023-03-14

在我看来,它没有在/blog路径中映射的原因是您没有使用该路径来访问它。

根据您在上面的问题中发布的错误,您定义/映射了:

/blog/hello

而您正试图访问:

/context/blog/hello.html

但是,如果可以避免的话,我一般建议不要使用通配符,因为当您向应用程序添加更多映射时,通配符可能会带来一些惊喜。

编辑--我刚刚发现您的控制器将这些映射搞得更乱了。一起阅读以下映射:@requestmapping(“/blog/hello”)@requestmapping(“/blog/hello.html”)@requestmapping(“/blog/hello.*”)

您的映射相互冲突。该列表中的第一个映射是其他映射的子集,因此它将用于匹配这些映射的任何URL。即第二个2是冗余的。您可以通过将'bare'/blog/hello放在其他2个后面来解决这个问题,这样更具体的映射就会首先被选中,但是,依赖于编写方法的顺序似乎是在自找麻烦。

 类似资料:
  • 引导 servlet 服务请求的请求路径由许多重要部分组成。以下元素从请求URI路径得到,并通过请求对象公开: Context Path:与ServletContext相关联的路径前缀是这个Servlet 的一部分。如果这个上下文是基于Web服务器的URL命名空间基础上的“默认”上下文,那么这个路径将是一个空字符串。否则,如果上下文不是基于服务器的命名空间,那么这个路径以“/”字符开始,但不以“/

  • Spring Cloud Greenwich将Spring Cloud netflix zuul置于维护模式,因此我正在尝试从zuul迁移到Spring Cloud Gateway。 和Zuul一起我有一条路 我所做的基本上是忽略接收路径中主计划之前或之后的所有内容,并重定向到api主计划。例如,和都指向同一个api(原因是是一个较大实体的子资源,该实体负责创建新的,但是可以将视为完整的资源,用于

  • 问题内容: 我正在用Capele在Capybara中编写自动化代码。我的HTML中包含以下元素,我想在capybara中单击该元素。 目前,工作方式如下。 但是我想从像这样的两个类的名称中选择元素 我知道我们可以触发JavaScript代码,但这并不明智。 问题答案: 您可以通过以下方式搜索元素 根据您的示例,似乎以下应该工作 您也可以使用

  • 我确实有一个图(~250个节点)。要连接到一个节点,我必须用points->加权图购买它。有些节点总是被占用(“声明的节点”),我可以从这些节点开始连接到其他节点。此外,我的点数有限。所有节点都可以连接在一起。 有什么方法可以得到一个图,其中所有的节点都必须连接在一起,点最少?如果可能的话,以给定的最大点数。 第二)有没有一种方法可以使它不需要一个完全连通的图?例如:一个“必须有节点”的节点直接连

  • 我有一个类项目,它使用一个字符作为标识符。 我希望能够检索由类表示的路径,它包含的简单有序列表: 为了存储和管理我的项目和路径,我使用了一个专用类。它包含两个,其中包含每种类型。我可以使用任务的标识符检索任务。 null 更新/注意:我正在寻找通过项目集构建路径

  • 我已经研究这个问题几个星期了,但我仍然无法解决这个问题。 我有一个CardView,它包含一个带有ImageView的线性布局。 没有那个半径共享元素过渡可以无缝工作。但是,当我将半径(app: cardCornerRadius="25dp")添加到CardView时,共享元素过渡看起来很难看,因为它首先删除半径,然后开始动画。 第一种方法:ObjectAnimator 我创建ObjectAnim