在 JAX-RS 资源中获取 ServletContext

Posted

技术标签:

【中文标题】在 JAX-RS 资源中获取 ServletContext【英文标题】:Get ServletContext in JAX-RS resource 【发布时间】:2010-12-21 08:00:45 【问题描述】:

我正在玩 JAX-RS,部署在 Tomcat 上。基本上是:

@Path("/hello")
@Produces("text/plain")
public class Hellohandler 

    @GET
    public String hello() 
        return "Hello World";
    


有什么方法可以在我的 JAX-RS 资源中获取ServletContext

【问题讨论】:

【参考方案1】:

就这样使用资源注入,

@Resource ServletContext servletContext;

【讨论】:

【参考方案2】:

此外,@Resource 注释可能不起作用。试试这个

@javax.ws.rs.core.Context 
ServletContext context;

在您点击服务方法之前不会发生注入

public class MyService 
    @Context ServletContext context;

    public MyService() 
         print("Constructor " + context);  // null here     
    

    @GET
    @Path("/thing")                
             print("in  wizard service " + context); // available here

【讨论】:

我使用哪个 javax.ws.rs 类作为 servlet 处理程序? 并没有真正让你明白这一点。您已经有了一个处理 HTTP GET 请求的类。请详细说明 Servlet 处理程序的含义。干杯。 servlet 容器需要一个 servlet 来处理请求。 com.sun.ws.rest.spi.container.servlet.ServletContainer 负责处理请求并将它们分派给我的注释类。你暗示我不应该使用 com.sun.* 类,那么我应该使用什么呢? 为什么不使用任何流行的 servlet 容器,例如 Jetty 或 Tomcat? 正如问题所说,我正在使用 Tomcat。 Tomcat 不会盲目地识别我的 jax-rs 注释类。它将需要一个 servlet 来处理请求。与 Jetty 的交易相同。【参考方案3】:

查看: http://markmail.org/message/isy6mdpoh66vyi6k#query:jersey%20getservletcontext%20-spring+page:1+mid:sa7n465kfgdoskv5+state:results

【讨论】:

【参考方案4】:

正如其他人所指出的,servletContext 可以在字段级别注入。也可以在方法级别注入:

public static class MyService 
    private ServletContext context;
    private int minFoo;

    public MyService() 
        System.out.println("Constructor " + context); // null here
    

    @Context
    public void setServletContext(ServletContext context) 
        System.out.println("servlet context set here");
        this.context = context;

        minFoo = Integer.parseInt(servletContext.getInitParameter("minFoo")).intValue();

    

    @GET
    @Path("/thing")
    public void foo() 
        System.out.println("in wizard service " + context); // available here
        System.out.println("minFoo " + minFoo); 
    

这将允许您使用可用的 servletContext 执行额外的初始化。

很明显 - 您不必使用方法名称 setServletContext。您可以使用任何您想要的方法名称,只要您遵循 setter 的标准 java bean 命名模式 void setXXX(Foo foo) 并使用 @Context 注释。

【讨论】:

不应该是setServletContext(@Context ServletContext上下文)【参考方案5】:

当您实现 ServletContextListener 时,servlet 上下文也可用。这使得在启动时加载连接字符串等参数变得容易。您可以在 web.xml 中定义侦听器类,该类会在您的 Web 应用程序启动时加载您的 ServletContextListener。

在 web.xml 文件中,添加 <listener><context-param> 标记。 <listener> 指定在启动时调用的类。 <context-param> 标记定义了您的 Web 应用程序中可用的上下文参数。

首先,在 web.xml 文件中包含 <listener><context-param> 标记:

<web-app>
  <!-- ... -->
  <listener>
    <listener-class>com.your.package.ServletContextClass</listener-class>
  </listener>

  <!-- Init parameters for db connection -->
  <context-param>
    <param-name>your_param</param-name>
    <param-value>your_param_value</param-value>
  </context-param>
  <!-- ... -->
</web-app>

现在创建 servlet 上下文类,如下所示。

public class ServletContextClass implements ServletContextListener

  public void contextInitialized(ServletContextEvent arg0) 
   
    //use the ServletContextEvent argument to access the 
    //parameter from the context-param
    String my_param = arg0.getServletContext().getInitParameter("your_param");
   //end contextInitialized method

  @Override
  public void contextDestroyed(ServletContextEvent arg0) 
   //end constextDestroyed method

您现在可以选择将哪个静态变量分配给您已读取的参数。这允许您在启动时读取参数一次,并通过分配给它的静态变量多次重复使用。

【讨论】:

也可以在 Apache Tomcat 中将 context-params 放在 conf/context.xml 中:***.com/a/1626190/2639234

以上是关于在 JAX-RS 资源中获取 ServletContext的主要内容,如果未能解决你的问题,请参考以下文章

在WebLogic 12c / Jersey上禁用JAX-RS资源的自动注册

Jax-RS请求映射到使用@DefaultValue和@QueryParam的操作

如何在注入 JAX-RS Web 服务的 CDI bean 中获取 HTTP 请求标头?

使用拦截器和注入在 JAX-RS 中进行身份验证/授权

JAX-RS 和 Spring Security - 获取经过身份验证的用户

JAX-RS的简介