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
    }
}