0

我是弹簧框架的新手。即使我对注释没有任何深入的概念。我正在使用 spring mvc 3 框架开发一个非常小的应用程序,并且我还使用了注释。我有一个困惑。我有一个 spring-servlet.xml。这里我没有定义任何处理程序映射。但它仍然有效。所以必须有一些默认的处理程序映射。您能否告诉我这个默认处理程序映射是什么以及如何覆盖它以便进行一些自定义。

4

3 回答 3

0

Spring 3.1 及更高版本不需要 [servelt-name]-servlet.xml 中的 DefaultAnnotationHandlerMapping 和 AnnotationMethodHandlerAdapter 声明

于 2014-03-11T14:46:52.283 回答
0

这些链接可能会有所帮助:

  1. Spring Controller 处理所有其他 Controller 不匹配的请求

  2. https://dzone.com/articles/using-the-spring-requestmapping-annotation

我遇到了刚刚解决的相同问题,因此我确认了以下方法有效,尽管这是使用注释而不是 XML 配置。

您在控制器类级别指定 URL 前缀并包含 ** 的请求映射注释,以确保您匹配通过该类的其他处理程序的任何内容。除了您正在定义一个保证与类级别映射下的所有内容匹配的处理程序这一事实之外,此处理程序实际上并没有什么特别或默认值。

注意:这不是魔术。您的处理程序仍然受制于 Spring 关于“最佳匹配”的排序算法。当没有其他匹配处理程序时,有一个提供真正默认值的注释会很好,特别是在复杂映射的情况下,“**”在这个包罗万象的处理程序之外很有用。基本实现是:

@RestController
@RequestMapping(value={"/path1/","/path2/"})
public class MyRestController {

    @RequestMapping("/subpath")
    String matchedRequestHandler () {
        return "This matches /path1/subpath and /path2/subpath.";
    }

    @RequestMapping("**")
    String unmatchedRequestsHandler () {
        return "This matches everything else.";
    }

}

在我的实际用例中,我需要处理 URL 模式内资源的任意路径,因此需要支持可变数量的目录。理想情况下,这将使用以下模式处理:

"/base/{optionaldir}/**/{entityName}/{describeVar:describe.json}" 

它本身可以正常工作,但它与绑定到“**”的默认处理程序不兼容,因为“**”映射是由 Spring 计算的,以更好地匹配这些类型的请求。

相反,我必须在我的请求映射中添加一堆单独的条目以支持 URL 模式中的任意路径,例如

value={"/base/{optionaldir}/{entityName}/{describeVar:describe.json}",
       "/base/{optionaldir}/*/{entityName}/{describeVar:describe.json}",
       "/base/{optionaldir}/*/*/{entityName}/{describeVar:describe.json}",
       "/base/{optionaldir}/*/*/*/{entityName}/{describeVar:describe.json}"
}

或者,我可以使用“**”映射处理所有内容并自己解析 URL,但这违背了使用带有路径变量的请求映射的目的。希望 Spring 的功能将来会在这方面有所发展。

于 2017-12-12T14:27:59.527 回答