У меня есть класс 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.