Как я могу передать общий объект ResourceConfig в Jetty? - PullRequest
0 голосов
/ 14 мая 2019

Я пишу небольшой встроенный веб-сервер Jetty, но у меня есть общий объект, который имеет дорогую конструкцию, и я не хочу, чтобы каждый отдельный запрос к сервлету перестраивал этот объект. К сожалению, способ добавления ресурса в Jetty - через конструктор ResourceConfig, но это не позволяет мне делать ничего, кроме добавления имени класса:

 // instantiate this expensive object
 MyExpensiveSharedObjectClass myExpensiveSharedObject = new MyExpensiveSharedObjectClass();
 String result = myExpensiveSharedObject.search("alpha");

 // set up the service
 final ResourceConfig resourceConfig = new ResourceConfig(MyService.class);

Тогда MyService.java содержит ваши стандартные объявления, такие как:

    @GET
    @Path("/doSomething")
    @Produces(MediaType.APPLICATION_JSON)
    public String doSomething() {
        // do stuff with myExpensiveSharedObject....except how do I get to it??
        // String result = myExpensiveSharedObject.search("alpha");

В идеале я хочу, чтобы каждый раз, когда запрос поступал в /doSomething, я мог выполнять методы для объекта myExpensiveSharedObject, который я создал ранее.

Я полагаю, это довольно просто, но я не могу найти простой способ сделать это.

В качестве альтернативы - есть ли способ иметь некоторую форму пространства общей памяти в сервлете Jetty? Я заметил, что каждый отдельный запрос, по-видимому, создает новый экземпляр сервлета, поэтому я не могу, например, создать карту разделяемой памяти внутри объекта, которая может быть повторно использована всеми экземплярами класса. Я уверен, что это возможно, но я не могу понять, как это сделать.

По сути, я просто пытаюсь найти способ создать объект, который дорого построить, что было бы идеальным в методе конструктора или передано в сам сервлет, но в контексте этих сервлетов конструкторы вызывал каждый запрос, поэтому я не могу идти по этому пути.

1 Ответ

1 голос
/ 14 мая 2019

Я думаю, у вас проблемы с майкой, а не с молнией (но вы можете столкнуться и с обеими проблемами!).Посмотрите, поможет ли Внедрение зависимостей с помощью Jersey 2.0 понять, как внедрить зависимости в ваши классы ресурсов.Если это так, то вы должны быть в состоянии сделать

bind(myExpensiveSharedObject).to(MyExpensiveSharedObjectClass.class)

в реализации AbstractBinder, которую затем можно зарегистрировать с помощью джерси ResourceConfig, выполнив

resourceConfig.register(binder)
...