当servlet-mapping url-pattern使用通配符时,我很难将请求映射到正确的servlet。我希望所有以“/ profile-api”开头的请求都映射到我将很快写的新REST服务。
来自web.xml:
<!-- default servlet -->
<servlet-mapping>
<servlet-name>professional</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- profile api -->
<servlet-mapping>
<servlet-name>profile-api</servlet-name>
<url-pattern>/profile-api/*</url-pattern>
</servlet-mapping>
来自控制器的伪代码,允许第三方系统更新用户的“电子邮件通信选择加入状态”(OptinResponse是一个域类,最终将转换为JSON并返回给调用者):
@Controller
@RequestMapping("/profile-api")
public class ProfileAPIController {
@RequestMapping(method = RequestMethod.GET, value="/setoptin/{userID}")
public @ResponseBody OptinResponse setOptinStatus(@PathVariable String userID) {
return new OptinResponse("200", "Successfully set optin status for user: " + userID);
}
}
我希望“{localhost} / profile-api / setoptin / 12345”的请求能够正确路由到ProfileAPIController,但事实并非如此。
将servlet-mapping url-pattern更改为更具体但仍然通用也失败:
<servlet-mapping>
<servlet-name>profile-api</servlet-name>
<url-pattern>/profile-api/setoptin/*</url-pattern>
</servlet-mapping>
我能够按预期路由我的请求的唯一方法是包含完整,准确的路径:
<servlet-mapping>
<servlet-name>profile-api</servlet-name>
<url-pattern>/profile-api/setoptin/12345</url-pattern>
</servlet-mapping>
显然,这是不可接受的,因为用户ID必须是可变的。
在所有情况下,请求都会映射到默认的“专业”servlet。我尝试重新排序servlet映射节点无济于事。我在servlet配置中的AnnotationMethodHandlerAdapter bean中将“alwaysUseFullPath”设置为“true”(但也尝试将其视为“false”)。我觉得好像我忽视了一些简单的东西,但却看不到森林里的树木。