一尘不染

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

tomcat

我正在将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>

…希望资源驻留在com.example程序包中的位置,我想是通过Java RTTI发现的。

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


阅读 609

收藏
2020-06-16

共1个答案

一尘不染

方法1 (使用servlet的init param
jersey.config.server.provider.packages):是特定于Jersey的,仅在包中显示。在不同的JAX-
RS实现之间不可移植。当您想限制考虑的JAX-RS资源类/应用程序时,可以在方案中使用它。

方法2 (使用servlet的init param javax.ws.rs.Application):任何JAX-
RS实现都必须支持此部署选项,因此必须是可移植的(尽管如果您切换至RestEasy之类的另一个JAX-
RS实现,则必须更改servlet的类)。此选项提供了更高的粒度(您可以完全选择要考虑的类,而不仅仅是整个软件包)。缺点:您必须编写更多代码。

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

方法4 如果要将战争归档中的所有类部署到servlet容器3中(没有显式定义的JAX-
RS应用程序),则也可以通过可移植的方式进行。在此处检查它:没有Application子类的JAX-
RS应用程序

2020-06-16