2015-11-23 3 views
1

Я использую механизм JerseyServletContainer, чтобы развернуть мои веб-службы REST. Конфигурация в web.xml выглядит следующим образом:JerseyServlet инициализирует ресурс при запуске сервера

<servlet> 
    <servlet-name>MyServlet</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.myservlet.classes 
     </param-value> 
    </init-param> 
    <load-on-startup>0</load-on-startup> 
</servlet> 

Что я хотел бы добиться того, что мой класс REST ресурсов, которые будут построены до первого HTTP вызова службы REST.

На данный момент, даже если я поставил

<load-on-startup>0</load-on-startup> 

кажется, фактического класса конструктор вызывается ServletContainer Джерси только тогда, когда запрос HTTP сначала сделал к этому ресурсу.

Есть ли способ достичь этого?

Мне нужно добавить, что в настоящий момент я только что добавил ServletContextListener, который делает HTTP-вызов самому себе. Но я бы хотел избежать этого хакерского пути.

Любые советы по оказанию помощи?

EDIT: Мне нужно добавить, что я использую @Singleton аннотацию на моем классе ресурсов, как мне нужно только один экземпляр по всему приложению

+0

Возможно, это должно дать вам больше информации - http://stackoverflow.com/questions/28917768/load-on-startup-and-jersey – aksappy

ответ

0

Вы можете использовать @Immediate сферу, как указано в this answer. Вы должны проверить ссылку «связанная проблема». Есть некоторые проблемы, связанные с утечками памяти с потоком Immediate. Кажется, проблема решена. поэтому вы должны убедиться, что используете последнюю версию, чтобы получить патч.

Связанный ответ использует конфигурацию без web.xml. Но если вы хотите сохранить свой web.xml (с помощью @ApplicationPath), вы можете объявить класс ResourceConfig в файле web.xml, если хотите.

public class JerseyApplication extends ResourceConfig { 

    @Inject 
    public JerseyApplication(ServiceLocator locator) { 
     ServiceLocatorUtilities.enableImmediateScope(locator); 
     packages("com.myservlet.classes"); 
    } 
} 

<servlet> 
    <servlet-name>MyServlet</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>org.foo.JerseyApplication</param-value> 
    </init-param> 
    <load-on-startup>0</load-on-startup> 
</servlet> 
Смежные вопросы