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

时间:2011-07-13 19:14:41

标签: spring url rest controller

我正在使用在Tomcat Apache 6.0环境中运行的Spring 3.0开发RESTful服务。 Spring DispatcherServlet配置为“/ spring / *”。 Spring servlet处理多个客户端,并在应用程序中有许多控制器。我正在为REST服务添加一个新的Controller。我希望我的所有控制器类都有一个像“ws”(web-service)这样的标识前缀,以便资源的完整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() { ... }  

....
}

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

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

进行访问

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

2 个答案:

答案 0 :(得分:5)

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

如果您希望映射的URL反映控制器的包名称,则应设置basePackage的{​​{1}}属性。 documentation

  

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

因此,示例bean定义可能是

ControllerClassNameHandlerMapping

您的控制器可能看起来像

<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"/>

答案 1 :(得分:0)

我实现的另一种方法(非常基本和简单)是定义多个Dispatcher servlet,然后为每个servlet映射不同的URL。 servlet共享根Spring上下文,除此之外,还有自己的bean定义。在此Java doc中阅读更多内容。

所以我的web.xml看起来像:

<servlet>
    <servlet-name>flex</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<!-- Mappings for BlazeDS requests -->
<servlet-mapping>
    <servlet-name>flex</servlet-name>
    <url-pattern>/spring/messagebroker/*</url-pattern>
</servlet-mapping>

<!-- Second dispatcher servlet for Web Services API -->
<servlet>
    <servlet-name>wsapi</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>wsapi</servlet-name>
    <url-pattern>/spring/ws/*</url-pattern>
</servlet-mapping>

基本上,我原样保留了现有的调度程序servlet,并且只为具有不同URL映射的REST控制器添加了一个新的servlet。所以我可以分别控制这些servlet的URL。在此之后,我不再需要在每个Controller上放置URL前缀。