我有一个带注释的休息控制器,如下所示。我能够很好地获得托管服务,但前提是我在web.xml中为每个服务配置完整路径:
@RestController
@RequestMapping("/service/")
public class StuffRestController
{
@RequestMapping("/getStuffList")
public List<Stuff> getStuffList() {
... make stuff ...
return stuffList;
}
... many other similar services ...
}
这是我应用程序中唯一的弹簧资源;虽然,我们正在使用弹簧安全。
以下是spring4-servlet.xml的唯一行:
<mvc:annotation-driven />
<context:component-scan base-package="com.me.stuff.presentation.controller" />
<context:component-scan base-package="com.me.stuff.security" />
StuffRestController类位于&#34; ... controller&#34;封装
的web.xml:
<servlet>
<servlet-name>spring4</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/spring4-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring4</servlet-name>
<url-pattern>/service/getStuffList</url-pattern>
</servlet-mapping>
以上所有实际上都运行良好和花花公子,但在这个控制器中有30个其他服务,我宁愿不为每个方法创建一个新的servlet映射。当我尝试&#34;通配符&#34;映射。我已尝试过/ service / ,/ service 和/ service / *。以及许多其他组合。
大部分内容都没有正确映射,我收到404错误。如果我使用/ service / *,它会在调用/ service / getStuffList时使用调度程序servlet,但它会响应:
WARNING: No mapping found for HTTP request with URI [/myapp/service/getStuffList] in DispatcherServlet with name 'spring4'
我确定这对于如何创建URL映射非常简单,但它让我不知所措。
答案 0 :(得分:6)
问题是您在/service/getStuffList
和DispatcherServlet
请求映射中包含了路径:@RestController
。因此,要访问其余控制器方法,您需要访问以下URL:
{contextPath}/service/getStuffList/service/getStuffList
因此,要么将调度程序servlet url-pattern更改为/
,那么它将处理进入应用程序的每个请求,然后基于myApp
之后的路径,将重定向到适当的控制器。或者,将RestController
映射设置为/*
。你应该更喜欢前一种方法。
如果您希望将{servlet句柄请求发送到/service
,请将网址格式更改为/service/*
。但是,您必须从类级别删除所有请求映射。另外在当前情况下,您需要点击以下网址:
{contextPath}/service/service/getStuffList
但是,如果要在路径解析中包含调度程序servlet url-pattern(即,您希望将类映射到/service
并将servlet映射到该路径),则可以设置{{1} }属性到URL处理程序映射的alwaysUseFullPath
。为此,请将以下内容添加到spring context xml文件中:
true