我一直在创造一个宁静的api,我遇到了一些我在互联网上找不到的问题。
如果我有applicationPath
指向"/"
的宁静api和同一项目中的某些非休息资源,会发生什么?同样的问题对于我添加到项目中的静态内容是有效的,但它被忽略了。
我们使用域名foo.com
和上下文名称bar
作为示例:
我创建了一个休息界面,其中@applicationPath
指向"/"
,资源@path
指向publications
。
所以我有foo.com/bar/publications
作为restful api的一部分,它会起作用。
但是如果我有api-doc
这样的静态内容,它应该出现在foo.com/bar/api-doc
上,那么它就会被忽略。
非rest api也是如此,就像一个简单的java的servlet一样。忽略了不是rest资源的斜杠之后的所有东西都会被忽略。
有没有办法让这些applicationPath
指向"/"
或者不可能让它们一起工作?因为我在文档上找不到任何关于它的内容。我只是想了解如何更好地利用它。
答案 0 :(得分:0)
可能与遇到这些问题的其他人有关。
听起来你有URL路径阴影的情况。考虑声明映射的顺序。
来自Servlet 3 spec, section 12.1:
使用第一次成功匹配,未尝试进一步匹配:
容器将尝试查找请求路径与servlet路径的完全匹配。成功的比赛选择 的servlet。
容器将递归尝试匹配最长的路径前缀。这是通过逐步降低路径树的目录来完成的 一次,使用'/'字符作为路径分隔符。最长的 match确定所选的servlet。
- 如果URL路径中的最后一个段包含扩展名(例如.jsp),则servlet容器将尝试匹配处理的servlet 请求延期。扩展名被定义为扩展名的一部分 最后一个'。'字符后的最后一段。
- 2.5之前的本规范的版本使用这些映射技术作为建议而不是要求,允许 每个servlet容器都有不同的映射方案 客户端对servlet的请求。 116 Java Servlet规范• 2009年11月
- 如果前三个规则都没有导致servlet匹配,则容器将尝试提供适合的内容 资源要求。如果"默认" servlet是为 应用程序,它将被使用。许多容器提供隐含的 用于提供内容的默认servlet。
醇>
或者,您可能无意中overriding您的web.xml中带有servlet-mapping元素的@ApplicationPath
希望有些人会觉得这很有用。