使用哪个初始化参数:jersey.config.server.provider.packages 或 javax.ws.rs.Application?

Posted

技术标签:

【中文标题】使用哪个初始化参数:jersey.config.server.provider.packages 或 javax.ws.rs.Application?【英文标题】:which init-param to use: jersey.config.server.provider.packages or javax.ws.rs.Application? 【发布时间】:2014-05-24 13:15:27 【问题描述】:

我正在将 JAX-RS Web 服务部署到 Tomcat servlet 容器。

我见过代码示例使用以下两种方法之一来指示web.xml 文件中的资源:

方法 1 - 使用 `jersey.config.server.provider.packages` 初始化参数

  <servlet>
      <servlet-name>Jersey Web Application</servlet-name>
      <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
      <init-param>
          <param-name>jersey.config.server.provider.packages</param-name>
          <param-value>com.example</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
  </servlet>

...资源应该驻留在com.example 包中,我想是通过Java RTTI 发现的。

方法 2 - 使用 `javax.ws.rs.Application` 初始化参数

<servlet>
 <servlet-name>jersey-serlvet</servlet-name>
 <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
   <init-param>
           <param-name>javax.ws.rs.Application</param-name>
           <param-value>full.qualified.name.to.MyApplication</param-value>
   </init-param>
 <load-on-startup>1</load-on-startup>
</servlet> 

...MyApplication 类明确标识资源类:

public class MyApplication extends javax.ws.rs.core.Application 
   public Set<Class<?>> getClasses() 
      Set<Class<?>> s = new HashSet<Class<?>>();
      s.add(ResourceA.class);
      return s;

使用一种方法与另一种方法纯粹是出于品味和配置工作的问题,需要考虑哪些权衡?就个人而言,我更喜欢 方法 2 提供的更细粒度的控制,但是 maven Jersey 2.7 原型:

mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-webapp \
            -DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false \
            -DgroupId=com.example -DartifactId=simple-service-webapp -Dpackage=com.example \
            -DarchetypeVersion=2.7

... 正在使用 方法 1,这让我开始思考。

【问题讨论】:

提出这个问题:你确定有一个你会接受的答案吗?因为配置泽西岛有很多可能性......一切都取决于你想要什么...... @AndreiI 我将接受一个讨论我提出的两个选项的答案,或者甚至指出另一个可能的选项,而不必提倡其中一个,只是讨论它们的实质性差异(如果有的话),或者以其他方式说明一种或另一种方式几乎没有真正的区别(如果是这样的话)。 【参考方案1】:

方法 1(使用 servlet 的 init 参数 jersey.config.server.provider.packages):是 Jersey 特定的并且只在包中查找。它不能在不同的 JAX-RS 实现之间移植。您可以在需要限制考虑的 JAX-RS 资源类/应用程序的场景中使用它。

方法 2(使用 servlet 的 init 参数 javax.ws.rs.Application):任何 JAX-RS 实现都必须支持此部署选项,因此是可移植的(尽管如果您切换到另一个 JAX-RS 实现,例如 RestEasy,您将不得不更改 servlet 的类)。此选项提供了更多粒度(您可以准确选择要考虑的类,而不仅仅是整个包)。缺点:你必须写更多的代码。

方法 3(在 Servlet 版本 3 容器中,您可能已经在其中部署):仅定义没有任何 servlet 的 JAX-RS 应用程序(检查 Deployment using web.xml descriptor)可能是最好的方法(如果您有明确声明的 JAX-RS 应用程序(您有),它还可以在 JAX-RS 实现之间移植,并且您可以更改 JAX-RS 实现而不更改 web.xml)。

方法 4 如果您想将 war 存档中的所有类部署到 servlet 容器 3(没有明确定义的 JAX-RS 应用程序)中,您也可以以可移植的方式执行此操作。在这里查看:JAX-RS application without an Application subclass

【讨论】:

以上是关于使用哪个初始化参数:jersey.config.server.provider.packages 或 javax.ws.rs.Application?的主要内容,如果未能解决你的问题,请参考以下文章

Java初始化与清理

org.apache.jmeter.samplers.sampleresult在哪个包里

linux 安装csvn 无法启动 哪个高手 哪位高手能帮小弟我

MFC如何知道光标在那个控件上 用哪个函数?谢谢

echarts i.getotheraxis is not a function 需要导入哪个js

Spring中过滤器+监听器的使用