Мой веб-контейнер знает, работает ли мое приложение в режиме отладки или в режиме выпуска. Я хотел бы передать эту информацию моему классу ResourceConfig/Application, но неясно, как прочитать эту информацию обратно.
Можно ли передавать информацию через параметры сервлета/фильтра? Если да, то как?
Ответ 1 · рейтинг 3 · dkoper
Вот как я это делаю:
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
Ответ 2 · рейтинг 3 · Gili
Это было исправлено в Джерси 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 из любой точки приложения.
Ответ 3 · Justin Emery
В Джерси 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;
});
};
}