实例化了两个JAX-RS资源实例

时间:2019-01-08 06:45:25

标签: java jersey jax-rs weblogic

我有一个服务类,它扩展了javax.ws.rs.core.Application,如下所示。它会覆盖getSingletons()以确保资源类CommonServices只有一个实例。

@ApplicationPath("/")
public class Services extends Application {

  @Override
  public Set<Object> getSingletons() {
      Set<Object> resources = new HashSet<>();
      set.add(new CommonServices());
      return set;
  }
}

在我的资源课程中:

@Path("/")
public class CommonServices{

  public CommonServices() {
  }

  ...
}

我将应用程序部署到WebLogic,该WebLogic使用JAX-RS的Jersey实现。启动该应用程序后,我注意到实例化了CommonServices的两个实例,而不仅仅是一个实例(我在其构造函数中放入了调试语句)。这些实例化发生在进行任何服务调用之前。为什么要实例化CommonServices的两个实例?

下面是我的web.xml的片段,显示了JAX-RS的相关部分。我必须注释掉servlet映射部分。如果我不予置评,则在部署期间,WebLogic将抱怨Web应用程序中的url-pattern / *被映射到多个servlet。为什么?

<servlet>
    <servlet-name>JAX-RS 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.xxx.xxx.xxx</param-value>
    </init-param>
    <init-param>
      <param-name>wl-dispatch-policy</param-name>
      <param-value>HighPriorityWorkManager</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<!--<servlet-mapping>
<servlet-name>JAX-RS Application</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>-->

编辑

我发现问题是由于容器两次调用了getSingletons()和getClasses()引起的。要解决此问题,我只需要在构造函数中而不是在getSingletons()中将资源添加到集合中。这样,就只能调用CommonServices的一个实例。

0 个答案:

没有答案