gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:40:09 33 4
gpt4 key购买 nike

我正在将 JAX-RS 应用程序部署到 JBoss EAP 6.2。我正在尝试获取 ServletContext从 JAX-RS 资源类内部,以便我可以阅读一些 context-param我在 WEB-INF/web.xml 中设置的值文件。即,在我掌握 ServletContext 之后我本来打算打电话ServletContext#getInitParam来获取该值。我正在使用注入(inject)来获取 ServletContext按照建议here .

我的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>

所以我使用与 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();
...
}
}

上面的代码总是产生RuntimeException被抛出。 IE。 RESTEasy 不知何故无法注入(inject) ServletContext 。请注意,我没有任何其他 JAX-RS 问题。 IE。如果我硬编码 context-param我希望能够通过“ServletContext#getInitParameter”检索值,然后当 WAR 部署到 JBoss 时,JAX-RS 剩余功能将按预期工作。

进一步实验我发现ServletContext仅当我在服务方法的参数处执行注入(inject)时才注入(inject),如下所示:

@Path("/somePath")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response someMethod(@Context ServletContext servletContext) {
...
}

...但是我不想更改 API。此外,我想基于context-param执行一些昂贵的初始化。值一劳永逸,而不是在每次服务方法调用时。

我的问题是:

  1. 为什么注入(inject)失败?
  2. 我对注释魔法在运行时失败感到有点厌倦,有没有办法获得 ServletContext不使用注释?
  3. 或者,我的MyApplication有可能吗?类获取ServletContext并将其传递给MyResource类作为构造函数参数?
  4. 如果一切都失败了,我想我总是可以使用 Class#getResourceAsStream 自己读取和解析 web.xml 文件。 ?

最佳答案

基于 FrAn 的评论,链接到 this answer ,这就是我最终所做的:

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")) ;
...
}

这作为我的 DAL 层的 UserDatabaseResource 类是一个单例,我只需要获取要使用的数据源的 JNDI 名称(来自 web.xml 文件)。但也许这种方法也适用于非单例类的一些细微调整。

关于java - @Context 未在 RESTEasy JAX-RS 应用程序中注入(inject) ServletContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41990590/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com