Два экземпляра ресурса JAX-RS созданы - PullRequest
0 голосов
/ 08 января 2019

У меня есть класс Services, который расширяет 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, в котором используются реализации JAX-RS на Джерси. После запуска приложения я заметил, что два экземпляра CommonServices были созданы вместо одного (я поместил операторы отладки в его конструктор). Эти экземпляры произошли до того, как были сделаны какие-либо сервисные вызовы. Почему создаются два экземпляра CommonServices?

Ниже приведен фрагмент моего файла web.xml, в котором показана соответствующая часть для JAX-RS. Я должен закомментировать часть отображения сервлетов. Если я не буду комментировать, во время развертывания WebLogic будет жаловаться на то, что url-pattern / * в веб-приложении отображается на несколько сервлетов. Почему?

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

EDIT

Я обнаружил, что проблема связана с тем, что контейнером вызывается getSingletons () и getClasses () дважды. Чтобы решить эту проблему, мне просто нужно добавить ресурсы в набор в конструкторе, а не в getSingletons (). Таким образом, когда-либо вызывается только один экземпляр CommonServices.

...