在Quarkus应用程序中注入ServletContext

时间:2019-06-10 18:32:41

标签: java resteasy quarkus

在玩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扩展名都可以提供ServletContext的注入,但是显然我的假设是错误的……有什么想法吗?

2 个答案:

答案 0 :(得分:2)

@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。

答案 1 :(得分: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();
    }
}