【问题标题】:Application context path at JAX-RS 2.0 resource instance constructionJAX-RS 2.0 资源实例构造中的应用程序上下文路径
【发布时间】:2014-12-03 02:54:11
【问题描述】:

是否可以在 JAX-RS 2.0 资源类实例构造时(也可能在静态类初始化时)获取 Java EE 7 应用程序的上下文路径,或者它是否仅在对端点的请求期间可用资源类?

上下文路径是指在 Java EE 7 应用程序中调用 HttpServletRequest#getContextPath() 返回的字符串。

我想您可能有多个已部署应用程序的上下文路径别名。如果是这样,上下文路径可能仅在请求时可用。

不过,我并不关心请求 URL 中实际使用的上下文路径。适用于类中端点的规范或默认上下文路径对我来说已经足够了。

获取这种上下文路径的技术不需要特定于 JAX-RS 2.0。它可能来自其他一些 Java EE 7 规范,只要它在 JAX-RS 2.0 资源类构建时(或更广泛地说,在静态类初始化时)有效。

更新:

我忘了提到这个类是 CDI @ApplicationScoped,所以它的构造函数不会在请求时调用,就像它是 @RequestScoped 一样。

【问题讨论】:

    标签: jakarta-ee jax-rs cdi java-ee-7 contextpath


    【解决方案1】:

    您可以通过在资源的构造函数中注入 UriInfo 来获取 REST 应用程序的基本 URI:

    @ApplicationScoped
    @Path("/resourcePath")
    public class MyRestResource {
    
        public MyRestResource (@Context UriInfo uriInfo) {
            URI uri = uriInfo.getBaseUri();
        }
    
        @GET
        public Response someMethod(){
            ...
        }
    }
    

    大多数UriInfo 方法将在资源构造时返回IllegalStateException,但getBaseUri() 方法将起作用。

    它会返回一个类似http://<hostname>:<port>/<context-path>/<base-path>的URI。

    但我不确定是否可以在类初始化时静态获取它...

    【讨论】:

    • 感谢您的信息。我会尝试一下。实际上我之前看到过那个类,但是因为它的 javadocs 指定:“如果在请求范围之外调用所有方法都会抛出 java.lang.IllegalStateException”docs.oracle.com/javaee/7/api/javax/ws/rs/core/UriInfo.html
    • 还有,我原来忘了说类是@ApplicationScoped,所以在请求的时候没有调用构造函数。
    • 确实如此,但是 javadoc 在除getBaseUri()getBaseUriBuilder() 之外的每个方法上都再次指定了它。我已经尝试过 Wildfly 8.1 并且它有效。资源也是@ApplicationScoped
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多