基于注释的spring项目的默认处理程序映射

时间:2013-05-29 12:13:31

标签: spring

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

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

这些链接可能有所帮助:

  
      
  1. Spring Controller to handle all requests not matched by other Controllers

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

  4.   

我有同样的问题,我刚刚解决,所以我已经确认下面的方法有效,虽然这是注释而不是XML配置。

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

注意:这不是魔术。您的处理程序仍然遵循Spring关于"最佳匹配"的排序算法。当没有其他任何东西匹配处理程序时,有一个注释提供一个真正的默认值会很好,特别是在复杂映射的情况下,其中" **"在这个catch-all处理程序之外是有用的。基本实现是:

@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的能力将来会在这个领域发展。