为包中所有控制器类的URL添加前缀

Shr*_*ang 7 rest url spring controller

我正在使用在Tomcat Apache 6.0环境中运行的Spring 3.0开发RESTful服务.Spring DispatcherServlet配置为"/ spring/*".Spring servlet处理多个客户端,并在应用程序中有许多控制器.我正在为REST服务添加一个新的Controller.我希望我的所有控制器类都有一个标识前缀,如"ws"(Web服务),以便资源的完整URL如下所示:
http://<server>:<port>/<context>/spring/ws/service1

我在Spring注释中找到的唯一方法是使用@RequestMapping,如下所示:

@Controller
@RequestMapping("/ws/service1")
public class Service1 {

@RequestMapping(method=RequestMethod.GET)
@ResponseBody
public String getHtml() { ... }  

....
}
Run Code Online (Sandbox Code Playgroud)

但由于我有几十个类,我不想在每个类中加上"/ ws"前缀.因此,如果另一个开发人员添加新服务,他不必记住放置此前缀,如果我们决定将前缀名称从"/ ws"更改为其他内容,我不必更改所有文件.我发现@RequestMapping注释仅适用于方法或类,而不适用于包级别.

有什么方法可以配置我的所有REST控制器都使用前缀访问?

请注意,我无法更改Spring servlet的web.xml URL映射,因为还有其他控制器使用该URL运行.

pto*_*mli 5

您可能希望查看Spring 3的配置支持约定,特别是ControllerClassNameHandlerMapping.实际上,您没有在a中@RequestMapping定义URL的位置,但它由处理程序的包位置定义.

如果您希望映射的URL反映控制器的包名称,那么您应该设置该basePackage属性ControllerClassNameHandlerMapping.该文件说:

设置用于生成路径映射的基础包,包括此包下面的所有子包作为路径元素.默认值为null,使用生成路径的短类名称,控制器的包未在路径中表示.指定一个像"com.mycompany.myapp"这样的基础包,将该基础包中的子包作为路径元素包含在内,例如为类名"com.mycompany.myapp.mymodule.BuyForm"生成路径"/ mymodule/buyform".子包层次结构表示为单独的路径元素,例如"/ mymodule/mysubmodule/buyform",类名为"com.mycompany.myapp.mymodule.mysubmodule.BuyForm".

因此,一个示例bean定义可能是

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">
    <property name="basePackage" value="com.company.project"/>
</bean>
<context:component-scan base-package="com.company.project.ws"/>
Run Code Online (Sandbox Code Playgroud)

你的控制器可能看起来像

package com.company.project.ws;
@Controller
public class Service1 {
    // your controller methods
}
Run Code Online (Sandbox Code Playgroud)