servlet url-pattern与通配符匹配的问题

时间:2016-09-28 21:23:57

标签: java spring servlets

当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”)。我觉得好像我忽视了一些简单的东西,但却看不到森林里的树木。

0 个答案:

没有答案