我正在使用在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运行。
答案 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前缀。