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

2022-09-01 14:31:51

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

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

方法 1 - 使用 'jersey.config.server.provider.packages' init-param

  <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>

...其中资源应驻留在包中,并且我认为是通过Java RTTI发现的。com.example

方法 2 - 使用 'javax.ws.rs.Application' init-param

<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,这让我开始思考。


答案 1

方法 1(使用 servlet 的 init 参数):是泽西岛特有的,只在包中查看。它不能在不同的 JAX-RS 实现之间移植。在需要限制所考虑的 JAX-RS 资源类/应用程序的情况下,可以使用它。jersey.config.server.provider.packages

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

方法 3(在 Servlet 版本 3 容器中,您可能已经部署了):如果您具有显式声明的 JAX-RS 应用程序(您有一个显式声明的 JAX-RS 应用程序),则仅定义没有任何 servlet 的 JAX-RS 应用程序(检查使用 web.xml 描述符进行部署)可能是最好的方法(它也可以在 JAX-RS 实现之间移植,并且可以在不更改 web.xml 的情况下更改 JAX-RS 实现)。

方法 4如果要在 servlet 容器 3 中部署 war 归档中的所有类(没有显式定义的 JAX-RS 应用程序),也可以以可移植的方式执行此操作。在此处查看:不带应用程序子类的 JAX-RS 应用程序


答案 2

推荐