2013-10-25 2 views
4

Мой веб-контейнер знает, работает ли мое приложение в режиме отладки или выпуска. Я хотел бы передать эту информацию в свой класс ResourceConfig/Application, но неясно, как читать эту информацию.Jersey 2: Как передать параметры из web.xml в приложение?

Возможно ли передавать информацию посредством параметров сервлета/фильтра? Если да, то как?

ответ

1

Это было исправлено в Джерси 2.5: https://java.net/jira/browse/JERSEY-2184

Теперь вы должны иметь возможность вводить @Context ServletContext в Application конструктор.

Вот пример того, как это предполагается работа:

public class MyApplication extends Application 
{ 
    private final String myInitParameter; 

    public MyApplication(@Context ServletContext servletContext) 
    { 
    this.myInitParameter = servletContext.getInitParameter("myInitParameter"); 
    } 
} 

Вы также можете вызвать ServiceLocator.getService(ServletContext.class) получить ServletContext из любой точки в приложении.

+0

Полезно знать! Не могли бы вы привести пример, чтобы ответить на поставленный вопрос? – Zero3

+0

@ Zero3 См. Обновленный ответ. – Gili

3

Вот как я это делаю:

в web.xml:

<context-param> 
    <description>When set to true, all operations include debugging info</description> 
    <param-name>com.example.DEBUG_API_ENABLED</param-name> 
    <param-value>true</param-value> 
</context-param> 

и в моем Application подкласса:

@ApplicationPath("api") 
public class RestApplication extends Application { 
    @Context 
    protected ServletContext sc; 

    @Override 
    public Set<Class<?>> getClasses() { 
    Set<Class<?>> set = new HashSet<Class<?>>(); 
    boolean debugging = Boolean.parseBoolean(sc 
      .getInitParameter("com.example.DEBUG_API_ENABLED")); 

    if (debugging) { 
     // enable debugging resources 
+0

Я не принял этот ответ, так как получаю значение ServletContext null. Глядя на http://stackoverflow.com/q/19450202/14731 Я не единственный. – Gili

+0

Тогда вы можете быть более конкретным в своем вопросе. Мой код работает для меня, совместим с Java EE и делает то, что вы задали в своем вопросе. Я заметил, что вы указали более подробную информацию в сообщении в списке рассылки в Джерси, о котором вы здесь не упоминаете: вы хотите, чтобы свойство стало доступным в конструкторе? Почему бы не принять мой ответ на вопрос, который вы разместили здесь, и задать новый вопрос с помощью все детали заранее? – dkoper

+0

Если вы определенно хотите параметры в конструкторе Application, я думаю, вам нужно будет рассмотреть один из других предложений (передавая их как системные свойства JVM, использование файла свойств и т. Д.). Но если вам просто нужны эти параметры во время запуска приложения (в отличие от каждого запроса для примера), может помочь класс @Provider (там, где поддерживается поддержка в конструкторах). В GlassFish 3.1.2.2 с Jersey 1.11.1, где я пытался, они создаются сразу после создания вашего подкласса Application (где я возвращаю свой класс '@ Provider' из' getSingletons'). – dkoper

0

В Джерси 1 можно было передать @Context ServletContext servletContext к конструктор класса Application, но в Джерси 2 это больше не работает. Кажется, что Джерси 2 будет вводить только во время запроса.

Чтобы обойти это на Джерси-2, используйте анонимный ContainerRequestFilter, чтобы получить доступ к ServletContext во время запроса и передать необходимые параметры init в класс Application.

public class MyApplication extends Application { 
    @Context protected ServletContext servletContext; 
    private String myInitParameter; 

    @Override 
    public Set<Object> getSingletons() { 
    Set<Object> singletons = new HashSet<Object>(); 
    singletons.add(new ContainerRequestFilter() { 
     @Override 
     public void filter(ContainerRequestContext containerRequestContext) throws IOException { 
     synchronized(MyApplication.this) { 
      if(myInitParameter == null) { 
      myInitParameter = servletContext.getInitParameter("myInitParameter"); 
      // do any initialisation based on init params here 
      } 
     } 
     } 
     return singletons; 
    }); 
    }; 
} 
Смежные вопросы