5

我有一个 Java Web 应用程序,它使用 Jersey 来公开一个 REST API。

@Path("/myRootResource")
public class resource
{
    @GET
    @Path("subResource_1")
    public Response subResource_1() {return null;}

    @GET
    @Path("subResource_2")
    public Response subResource_2() {return null;}
}

我想为特定资源下的每个子资源运行一些代码。此代码处理身份验证任务、性能指标(例如,计算请求时间的开始时间)初始化和调试变量。

到目前为止,我的所有代码都在一个函数中(例如preTasks()),我在每个子资源方法的开头运行它。我需要一些如何自动执行此操作并使该代码块为 的每个子资源运行myRootResource,而不必将上述函数复制粘贴到每个子资源方法。

这是可以用 Jersey 的过滤器或拦截器完成的吗?

虽然我对 Spring 不是很熟悉,但我认为我想要实现的目标与此类似:Spring Web 应用程序:在控制器中输入 RequestMapping 之前执行公共代码

更新 12/06/2015
正如评论中所指出的,“拦截器”是一个不错的选择。但是只有 Jersey 2.X 及更高版本才支持“拦截器”。在我的代码中,我使用的是 Jersey 1.18。升级到 Jersey 2.X 会破坏我的部分代码,所以我现在正试图避免这种情况。

泽西岛 1.18 中是否有任何与“拦截器”等效的东西,或者我唯一的选择是升级。我认为“调度员”可能会胜任这项工作,这是正确的吗?

4

2 回答 2

4

我用这个:

/**
 * This method is called by JAX-RS for each request before the identified resource method is
 * invoked, since it is annotated with the Context annotation.
 */
@Context
public void setServletContext( ServletContext servletContext ) {

}

我把它放在资源类中。

于 2015-06-12T09:53:24.207 回答
1

除了前面的答案,获取请求、响应和会话:

@Context
public void setServletContext(
                ServletContext servletContext,
                @Context final HttpServletRequest request,
                @Context final HttpServletResponse response
) {
    // you can also get to the session
    // it is recommended to uncomment the "false" argument below
    // to avoid creating sessions if they don't already exist
    HttpSession session = request.getSession(/*false*/);
}

您还可以将其放在您的资源扩展的类中,以便为所有资源中的每个请求执行它。

于 2018-10-28T23:38:08.130 回答