当前位置: 首页 > 知识库问答 >
问题:

@Context未在RESTEasy JAX-RS应用程序中注入ServletContext

晋骏喆
2023-03-14
<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>

所以我使用的是与JBoss捆绑在一起的RESTEasy。

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

…最后,在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();
        ...
    }
}
@Path("/somePath")
@GET
@Produces(MediaType.APPLICATION_JSON) 
public Response someMethod(@Context ServletContext servletContext) {
    ...
}

我的问题是:

  1. 为什么注射失败?
  2. 我有点厌倦了注释魔术在运行时失败,有没有一种方法可以不使用注释就获得ServletContext
  3. 或者,我的MyApplication类是否可以获得ServletContext并将其作为构造函数参数传递给MyResource类?
  4. 如果所有其他方法都失败了,我想我总是可以使用类#getResourceAsstream
  5. 自己读取和解析web.xml文件

共有1个答案

洪博涛
2023-03-14

根据FrAn链接到这个答案的评论,这就是我最后做的:

public class JaxRsApplication extends Application {

    private Set<Object> singletons = new HashSet<>();

    public JaxRsApplication(@Context ServletContext servletContext) {
        Assert.assertNotNull(servletContext);
        singletons.add( new UserDatabaseResource(servletContext) );
    }

    @Override
    public Set<Object> getSingletons() {
        return singletons;
    }
}

…然后,在UserDatabaseResource类中,我有以下内容:

public UserDatabaseResource(ServletContext servletContext) {
    Assert.assertNotNull(servletContext);
    ...
    String jndiNameForDatasource = servletContext.getInitParameter("whatever")) ;
    ...
}

它作为UserDatabaseResource类工作,我的DAL层是一个单例,我只需要获得要使用的数据源的JNDI名称(从web.xml文件中)。但是,对于非单例类,这种方法也可以进行一些小的调整。

 类似资料:
  • 我正试图在Tomcat 7.0.34.0上使用Servlet3.0应用程序类开发一个RESTful webapp,但似乎没有任何工作。我对以前的应用程序使用Jersey ServletContainer方法并在web.xml中声明所有REST服务没有任何问题。 我的当前应用程序子类: 和web服务: 当我尝试部署应用程序时,Tomcat告诉我上下文已重新加载: web应用程序本身已经部署(我可以访

  • 我正在迁移一个遗留服务框架,该框架使用java序列化/反射来注册服务,并将它们作为远程endpoint(javabin over http)或本地调用无缝地调用。我已经将远程调用替换为jerseyendpoint。并使用基于hk2 aop的拦截器重新构建了现有框架的部分拦截能力。当远程客户端调用endpoint时,它工作正常。现在,我需要对服务方法的本地调用执行相同的操作,并且能够使用与远程服务方

  • 问题内容: 我在下面有这样的设置。这是一个简化的版本,但我认为它已涵盖了基本思想。我正在使用Jersey 2.16,Java 1.8和Glassfish Open Source 4.1 但是,当我部署并尝试访问Web服务时,我从安全上下文中得到了NullPointer异常。似乎根本没有注入上下文。我检查了这是secContext变量本身,而不仅仅是从getUserPrincipal()返回的nul

  • 问题内容: 我只是熟悉使用JAX-RS在Java中实现REST Web服务,因此遇到了以下问题。我的资源类之一要求访问存储后端,该后端在接口后被抽象化。我想将当前实例注入到服务REST请求的资源类中,并且我认为这样做的一种好方法是使用批注和适当的类。这是我到目前为止所拥有的: 在: 在: 我用来自动发现提供程序和资源类,并且根据日志,它很好地拾取了该类(故意遗漏了时间戳和不必要的内容): 但是,资

  • 问题内容: 我使用AppFuse创建了一个基本的应用程序外壳,并按照AppFuse教程使用Jax- RS创建了一个简单的RESTful服务。那很好。调用时,将Person对象的集合作为Json格式的字符串返回,并带有正确的数据。 我现在想从Appfuse提供的RESTful服务中访问和对象(以使用需要这些对象的另一个库)。 我 _认为_应该可以通过添加@Context注释来实现,但是,如果我添加@

  • 问题内容: 我尝试使用angular-ui,并尝试注入$ stateProvider: html js(test / appModule.js) 堆栈跟踪 如果我删除带有注释的 $ stateProvider 和 ui.router ,那么一切都会起作用: 那么注入 $ stateProvider 的问题有解决的任何想法吗? PS 我尝试了ui示例,它可以工作,但是我无法弄清楚为什么我的不行。 问