gpt4 book ai didi

spring - 为包中所有 Controller 类的 URL 添加前缀

转载 作者:行者123 更新时间:2023-12-03 03:22:13 36 4
gpt4 key购买 nike

我正在使用 Spring 3.0 开发一个在 Tomcat Apache 6.0 环境上运行的 RESTful 服务。 Spring DispatcherServlet 配置在“/spring/*”。 Spring servlet 处理多个客户端,并在应用程序中拥有许多 Controller 。我正在为 REST 服务添加一个新的 Controller 。我希望所有 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() { ... }

....
}

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

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

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

最佳答案

您可能想查看 convention over configuration支持 Spring 3,特别是 ControllerClassNameHandlerMapping 。实际上,您不会在 @RequestMapping 中定义 URL 的位置,而是由处理程序的包位置定义。

如果您想让映射的 URL 反射(reflect) Controller 的包名称,那么您应该设置 ControllerClassNameHandlerMappingbasePackage 属性。 documentation

Set the base package to be used for generating path mappings, including all subpackages underneath this packages as path elements. Default is null, using the short class name for the generated path, with the controller's package not represented in the path. Specify a base package like "com.mycompany.myapp" to include subpackages within that base package as path elements, e.g. generating the path "/mymodule/buyform" for the class name "com.mycompany.myapp.mymodule.BuyForm". Subpackage hierarchies are represented as individual path elements, e.g. "/mymodule/mysubmodule/buyform" for the class name "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"/>

你的 Controller 可能看起来像

package com.company.project.ws;
@Controller
public class Service1 {
// your controller methods
}

关于spring - 为包中所有 Controller 类的 URL 添加前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6684320/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com