JAX-RS的注释@ApplicationPath如何与非rest资源并排运行?

时间:2016-11-28 06:38:27

标签: java rest jax-rs

我一直在创造一个宁静的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指向"/"或者不可能让它们一起工作?因为我在文档上找不到任何关于它的内容。我只是想了解如何更好地利用它。

1 个答案:

答案 0 :(得分:0)

可能与遇到这些问题的其他人有关。

听起来你有URL路径阴影的情况。考虑声明映射的顺序。

来自Servlet 3 spec, section 12.1

  

使用第一次成功匹配,未尝试进一步匹配:

     
      
  1. 容器将尝试查找请求路径与servlet路径的完全匹配。成功的比赛选择   的servlet。

  2.   
  3. 容器将递归尝试匹配最长的路径前缀。这是通过逐步降低路径树的目录来完成的   一次,使用'/'字符作为路径分隔符。最长的   match确定所选的servlet。

  4.   
  5. 如果URL路径中的最后一个段包含扩展名(例如.jsp),则servlet容器将尝试匹配处理的servlet   请求延期。扩展名被定义为扩展名的一部分   最后一个'。'字符后的最后一段。
  6.   
  7. 2.5之前的本规范的版本使用这些映射技术作为建议而不是要求,允许   每个servlet容器都有不同的映射方案   客户端对servlet的请求。 116 Java Servlet规范•   2009年11月
  8.   
  9. 如果前三个规则都没有导致servlet匹配,则容器将尝试提供适合的内容   资源要求。如果"默认" servlet是为   应用程序,它将被使用。许多容器提供隐含的   用于提供内容的默认servlet。
  10.   

或者,您可能无意中overriding您的web.xml中带有servlet-mapping元素的@ApplicationPath

希望有些人会觉得这很有用。