我有一个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中是否有“拦截器”,或者我唯一的选择就是升级。我认为“调度员”可能会找到工作,这是正确的吗?
答案 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”方法即可达到目的。