Джерси 2: как передать параметры из web.xml в приложение?

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

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


person Gili    schedule 25.10.2013    source источник


Ответы (3)


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

in 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
person dkoper    schedule 25.10.2013
comment
Я не принял этот ответ, так как получаю нулевое значение ServletContext. Глядя на stackoverflow.com/q/19450202/14731, я не единственный. - person Gili; 27.10.2013
comment
Возможно, тогда вы захотите уточнить свой вопрос. Мой код у меня работает, соответствует спецификации Java EE и делает то, что вы задали в своем вопросе. Я заметил, что вы предоставили более подробную информацию в сообщении для списка рассылки Джерси, которое вы не упомянули здесь: вы хотите, чтобы свойство стало доступным в конструкторе? Почему бы не принять мой ответ на вопрос, который вы разместили здесь, и задать новый вопрос с все подробности заранее? - person dkoper; 28.10.2013
comment
Если вам определенно нужны параметры в конструкторе приложения, я думаю, вам нужно взглянуть на одно из других предложений (передача их в качестве системных свойств в JVM, использование файла свойств и т. д.). Но если вам просто нужны эти параметры во время запуска приложения (а не, например, для каждого запроса), может помочь класс @Provider (где в конструкторах поддерживается внедрение). В GlassFish 3.1.2.2 с Jersey 1.11.1, где я пытался, они создаются сразу после создания экземпляра вашего подкласса Application (где я возвращаю свой класс @Provider из getSingletons). - person dkoper; 28.10.2013

Это было исправлено в Джерси 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 из любой точки приложения.

person Gili    schedule 15.11.2013
comment
Хорошо знать! Не могли бы вы привести пример, чтобы фактически ответить на поставленный вопрос? - person Zero3; 15.01.2016

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

Чтобы обойти это в Джерси 2, используйте анонимный ContainerRequestFilter, чтобы получить доступ к ServletContext во время запроса и передать необходимые параметры инициализации в класс 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;
    });
  };
}
person Justin Emery    schedule 14.11.2013