2

玩弄Quarkus,我试图ServletContext在我的应用程序中注入:

@Controller
@Path("/greeting/")
@RequestScoped
public class GreetingResource {
    @Inject
    ServletContext servletContext;
}

它编译得很好,但在打包阶段 quarkus-maven-plugin 失败:

[1] Unsatisfied dependency for type javax.servlet.ServletContext and qualifiers [@Default]
    - java member: exampleapp.GreetingResource#servletContext
    - declared on CLASS bean [types=[java.lang.Object, exampleapp.GreetingResource], qualifiers=[@Default, @Any], target=exampleapp.GreetingResource]

我的应用程序依赖于io.quarkus:quarkus-resteasy,它会引入 io.quarkus:quarkus-undertow,而后者又会引入 io.undertow:undertow-servlet

我希望任何 Undertow-extensions 都提供注入ServletContext,但显然我的假设是错误的......有什么想法吗?

4

2 回答 2

3

@Inject ServletContext 仅适用于 Java EE 环境。Quarkus 集成了 JAX-RS,因此您可以使用JAX-RS @Context访问 ServletContext 实例

@Controller
@Path("/greeting/")
@RequestScoped
public class GreetingResource {

    // javax.ws.rs.core.Context
    @Context
    ServletContext servletContext;

    // OR

    @GET
    @Path("/test")
    @Produces({ MediaType.TEXT_PLAIN })
    public Response test(@Context ServletContext servletContext) {
        // return ...
    }
}

您的方式也有效,但它明确取决于 Undertow API。

更新:

Quarkus 版本 0.17.0+ 添加了对使用 CDI @Inject 注释的 ServletContext 注入的支持。看到这个https://github.com/quarkusio/quarkus/pull/2850

于 2019-06-10T20:08:20.447 回答
0

一些摆弄向我展示了这种类型没有生产者方法......以下片段帮助了我:

import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Produces;
import javax.inject.Singleton;
import javax.servlet.ServletContext;

import io.undertow.servlet.handlers.ServletRequestContext;

@Singleton
public class ServletContextProducer {
    @Produces
    @RequestScoped
    public ServletContext servletContext() {
        return ServletRequestContext.current().getCurrentServletContext();
    }
}
于 2019-06-10T19:43:09.880 回答