Java 获取应用程序中的ServletContext
您能否解释一下如何在我的Java 获取应用程序中的ServletContext,java,jersey,jax-rs,Java,Jersey,Jax Rs,您能否解释一下如何在我的应用程序的子类中获取ServletContext实例?可能吗?我在下面的代码片段中尝试过这样做,但似乎不起作用-未设置ctx: import javax.ws.rs.core.Application; import javax.ws.rs.core.Context; //... @ApplicationPath("/") public class MainApplication extends Application { @Context ServletCo
应用程序的子类中获取ServletContext
实例?可能吗?我在下面的代码片段中尝试过这样做,但似乎不起作用-未设置ctx
:
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context;
//...
@ApplicationPath("/")
public class MainApplication extends Application {
@Context ServletContext ctx;
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
//...
return classes;
}
}
谢谢。当您进入服务方法时,会发生注入。检查这是否有问题。不要在应用程序中使用@Context
,而要在资源类中使用
@Path("/foos")
public class FooResource {
@Context
ServletContext ctx;
@GET
public Response getFoos() {
return Response.ok().build();
}
}
泽西岛1.18版的课程文档中有一条有趣的语句
servlet或过滤器可以配置为具有初始化
参数“com.sun.jersey.config.property.resourceConfigClass”或
“javax.ws.rs.Application”,其值是
实现ResourceConfig或应用程序的类。如果混凝土
类有一个构造函数,该构造函数接受一个Map类型的参数
然后使用该构造函数和实例实例化该类
包含所有初始化参数的映射的
参数
如果我的理解是正确的,则必须向以下构造函数添加“包含所有初始化参数的Map实例”
以下是web.xml的适当部分:
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>experiment.service.ExampleApplication</param-value>
</init-param>
</servlet>
Jersey Web应用程序
com.sun.jersey.spi.container.servlet.ServletContainer
javax.ws.rs.Application
experiment.service.example应用程序
但不知怎的,我失败了,我得到了以下信息:
严重:缺少公共构造函数的依赖项
参数处的实验.service.ExampleApplication(java.util.Map)
索引0
对于泽西岛的当前版本(2.5.1),文件中没有此类声明:
您可以使用ApplicationEventListener
界面获取ServletContext
。初始化完成后,您可以“捕获”一个ApplicationEvent
,并使用注入的ServletContext
进行处理。
适用于:org.glassfish.jersey:2.12
对于其他版本,请使用评论-我不知道,sry
您的main应用程序
:
@ApplicationPath("/")
public class MainApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> set = new HashSet<Class<?>>();
set.add(MainApplicationListener.class);
return classes;
}
}
以及应用程序EventListener
:
public class MainApplicationListener implements ApplicationEventListener {
@Context
private ServletContext ctx; //not null anymore :)
@Override
public void onEvent(ApplicationEvent event) {
switch (event.getType()) {
case INITIALIZATION_FINISHED:
// do whatever you want with your ServletContext ctx
break;
}
@Override
public RequestEventListener onRequest(RequestEvent requestEvent) {
return null;
}
}
@Context
可以通过使用@Context
将其作为构造函数参数注入到resourceconfig
上另一种访问它的方法是通过事件处理程序
请尝试下面的代码
@ApplicationPath("...")
public class MyApplication extends ResourceConfig {
public MyApplication() {
register(StartupHandler.class);
}
private static class StartupHandler extends AbstractContainerLifecycleListener {
@Context
ServletContext ctx;
@Override
public void onStartup(Container container) {
// You can put code here for initialization.
}
}
// ...
自Jersey 2.5以来,ServletContext可以直接注入构造函数:
@你在用哪个应用服务器?@paulvargas我在用Tomcat7@Buhb,这不是重复的。他试图从应用程序访问ServletContext
,而另一篇文章则试图从资源访问它。我已经删除了评论。谢谢。但是,我不是问在哪里使用@Context,而是问如何获取SerlvetContext
。我已经更新了我的问题,使之更清楚。@Industrious在您的情况下,BaseDataAccess
可以使用@Context-ServletContext-ctx。
注意:这也可以作为特定方法的参数。此外,java.net链接已失效。
@ApplicationPath("/")
public class MainApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> set = new HashSet<Class<?>>();
set.add(MainApplicationListener.class);
return classes;
}
}
public class MainResourceConfig extends ResourceConfig {
public MainResourceConfig() {
register(MainApplicationListener.class);
}
}
public class MainApplicationListener implements ApplicationEventListener {
@Context
private ServletContext ctx; //not null anymore :)
@Override
public void onEvent(ApplicationEvent event) {
switch (event.getType()) {
case INITIALIZATION_FINISHED:
// do whatever you want with your ServletContext ctx
break;
}
@Override
public RequestEventListener onRequest(RequestEvent requestEvent) {
return null;
}
}
@ApplicationPath("...")
public class MyApplication extends ResourceConfig {
public MyApplication() {
register(StartupHandler.class);
}
private static class StartupHandler extends AbstractContainerLifecycleListener {
@Context
ServletContext ctx;
@Override
public void onStartup(Container container) {
// You can put code here for initialization.
}
}
// ...
public class MyApplication extends ResourceConfig {
public MyApplication(@Context ServletContext servletContext) {
// TODO
}
}