Jersey / ServletContext и загрузка ресурсов при запуске - PullRequest
8 голосов
/ 31 мая 2010

Я новичок в веб-разработке на Java. Я разрабатываю веб-сервис и выбрал для него REST / Джерси .

Я хочу инициировать некоторые вещи при запуске службы и сохранить их на протяжении всего срока службы.

Первый вопрос: Является ли конструктор сервлета Джерси хорошим местом для этого?

По сути, я хочу загрузить файл config.ini, расположенный в моем каталоге WEB-INF. После этой справки я понимаю, что мне нужен ServletContext для загрузки моего файла в качестве ресурса.

Однако, мне не ясно, как получить этот ServletContext в Jersey Servlet, так как это на самом деле не экземпляр сервлета, а скорее POJO с некоторыми аннотаций. Я хотел попробовать этот совет , но атрибут "context" в конструкторе равен нулю. Я думаю, что Джерси может заполнить его после конструктора. Правильно?

Так как же правильно сделать это?

Вот мой код:

/** Main REST servlet */
@Path("/")
public class Servlet {

    // ---------------------------------------------------- 
    // Constants                     
    // ---------------------------------------------------- 

    static private final String CONFIG_PATH = "/WEB-INF/config.ini";

    // ---------------------------------------------------- 
    // Attributes                     
    // ---------------------------------------------------- 

    /** Context */
    @Context ServletContext context;

    // ---------------------------------------------------- 
    // Constructor                     
    // ---------------------------------------------------- 

    /** Init the servlet */
    public Servlet() {

        // Load config.ini from WEB-INF
        Config.config = new Config(
                this.context.getResourceAsStream(CONFIG_PATH));

        // FAIL! this.context is null ...

    }

    // ---------------------------------------------------- 
    // URI Handlers                    
    // ---------------------------------------------------- 

    /** Welcome page */
    @GET
    @Path("/")
    @Produces(MediaType.TEXT_HTML)
    public String welcome() {
        return "<h1>Hi there.</h1>";
    }
}

Любая помощь будет высоко ценится. Заранее спасибо,

Raphael

Ответы [ 2 ]

9 голосов
/ 25 апреля 2012

Использование ContextListener не является способом JAX-RS для этого - ContextListener - это, как бы, «следующий уровень вниз» в API сервлета.

Вы можете поместить аннотированное объявление в параметры конструктора, и оно будет передано конструктору:

public Servlet(@Context ServletContext context) {

Использование аннотации @Context для элемента данных, как вы обнаружили, инициализирует этот элемент после создания объекта.

Еще один способ сделать это - переместить инициализацию объекта Config в какой-то вызов инициализации и инициализировать его только тогда, когда это необходимо, то есть ленивая инициализация. Тогда элемент данных ServletContext уже будет задан структурой Джерси.

Удачи!

Kirk

7 голосов
/ 31 мая 2010

Я не знаком с Джерси, но, как правило, в веб-приложении на Java я думаю, что правильнее всего было бы создать ContextListener.

Слушатель контекста - это класс, который реализует интерфейс javax.servlet.ServletContextListener и настраивается в вашем файле web.xml. У него есть метод, который выполняется, когда приложение впервые загружается в ваш контейнер, и еще один, который выполняется, когда приложение останавливается, поэтому он является идеальным местом для размещения однократной инициализации и очистки перед приложение остановлено.

Итак, шаги:

  1. создайте свой класс Listener, реализуйте метод contextInitialized (ServletContextEvent sce). В этом методе вы получаете ServeltContextEvent, у которого есть метод getServletContext (), который дает вам доступ к ServletContext.
  2. Настройте ваш слушатель в вашем web.xml

Вы найдете дополнительную информацию здесь: учебник

Или на сайте Sun, то есть на сайте Oracle.

Кстати, если ваш файл будет в JAR-файле, я не уверен, что метод ServletContext - лучший способ его загрузки. Я думаю, что тебе лучше с чем-то вроде:

this.getClass().getClassLoader().getResourceAsStream("com.company.my.file.properties");
...