Я развертываю приложение JAX-RS в JBoss EAP 6.2. Я пытаюсь получить ServletContext
из класса ресурсов JAX-RS, чтобы я мог прочитать значения context-param
, которые я установил в файле WEB-INF/web.xml
. I.e., после того как я завладел ServletContext
, я планировал позвонить ServletContext#getInitParam
, чтобы получить значение. Я использую инъекцию, чтобы получить ServletContext
по рекомендации here.@ Контекст не вводится ServletContext в приложении RESTEasy JAX-RS
Соответствующая часть моего web.xml
является:
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>foo.MyApplication</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/jax-rs/*</url-pattern>
</servlet-mapping>
Так я использую Resteasy, который поставляется вместе с JBoss.
Класс MyApplication
является:
public class MyApplication extends Application {
private Set<Object> singletons = new HashSet<>();
public MyApplication() {
singletons.add(new MyResource());
}
@Override
public Set<Object> getSingletons() {
return singletons;
}
}
& hellip; и, наконец, в классе MyResource
У меня есть следующие:
@Path(...)
public class MyResource {
@Context
ServletContext context;
public MyResource() {
// I understand context is supposed to be null here
}
// ... but it should have been injected by the time we reach the service method.
@Path("/somePath")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response someMethod() {
if (context==null) throw new RuntimeException();
...
}
}
Приведенный выше код всегда приводит к RuntimeException
броска. То есть RESTEasy как-то не в состоянии ввести ServletContext
. Обратите внимание, что у меня нет других проблем JAX-RS. То есть если я жёстко в context-param
значения я в надежде, чтобы иметь возможность получить через `ServletContext # getInitParameter», то JAX-RS функциональность остальное работает, как ожидалось, когда WAR развертывается JBoss.
Экспериментируя дальше, я обнаружил, что в ServletContext
только вводится, если я выполнить инъекцию в качестве аргумента метода службы, как это:
@Path("/somePath")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response someMethod(@Context ServletContext servletContext) {
...
}
& hellip; однако я предпочел бы не менять API Кроме того, я хотел бы выполнить некоторые дорогостоящие инициализации, основанные на. context-param
Значение раз и навсегда, а не на каждом вызове метода обслуживания.
Мои вопросы:
- почему не удается инъекции?
- Я немного устал от магии аннотаций, которая не срабатывает во время выполнения, есть ли способ получить
ServletContext
без использования аннотаций? - В качестве альтернативы, возможен ли мой класс
MyApplication
для полученияServletContext
и передать его классуMyResource
в качестве параметра конструктора? - Если все остальное не удается, я думаю, что я всегда могу прочитать и проанализировать файл web.xml самостоятельно, используя
Class#getResourceAsStream
?
Взгляните на http://stackoverflow.com/questions/1814517/get-servletcontext-in-jax-rs-resource?noredirect11&lq=1 – gladiator
@gladiator Я специально ссылаюсь на этот ответ в своем вопросе (по адресу начальный абзац) –
Проверьте это: http://stackoverflow.com/questions/5434667/rest-easy-and-init-params-how-to-access – FrAn