泽西岛 - 在运行一组选定的子资源之前执行'通用'代码

时间:2015-06-11 14:40:40

标签: java rest jersey-1.0

我有一个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的每个子资源运行,而无需将上述函数复制粘贴到每个子资源方法。

这可以用泽西的过滤器或拦截器来完成吗?

虽然我对Spring并不熟悉,但我认为我想要实现的目标与此类似:Spring web application: executing common code before entering RequestMapping in controller

2015年12月6日更新
正如评论中所指出的,“拦截器”是一个很好的方法。但'拦截器'仅受泽西2.X及以上版本的支持。在我的代码中,我使用Jersey 1.18。升级到Jersey 2.X会破坏我的代码的一部分,所以我现在试图避免这种情况。

泽西岛1.18中是否有“拦截器”,或者我唯一的选择就是升级。我认为“调度员”可能会找到工作,这是正确的吗?

3 个答案:

答案 0 :(得分:3)

我用这个:

/**
 * 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 ) {

}

我把它放在资源类中。

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

您也可以将其放在您的资源可以扩展的类中,以使其针对所有资源中的每个请求执行。

答案 2 :(得分:0)

值得一提的是,使用@Context注释时实际上不需要注入任何东西;只要您在Jersey所管理的类中工作,只需使用@Context标记“ @Before”方法即可达到目的。