在 Quarkus 应用程序中注入 ServletContext
Inject ServletContext in Quarkus application
在我的应用程序中注入 Quarkus, I'm trying to get the 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
的注入,但显然我的假设是错误的...有什么想法吗?
经过一些摆弄,我发现没有适用于这种类型的生产者方法...以下代码片段帮助我解决了问题:
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();
}
}
@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
在我的应用程序中注入 Quarkus, I'm trying to get the 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
的注入,但显然我的假设是错误的...有什么想法吗?
经过一些摆弄,我发现没有适用于这种类型的生产者方法...以下代码片段帮助我解决了问题:
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();
}
}
@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