gpt4 book ai didi

jersey - Jersey JAX-RS 中的异常处理/资源管理

转载 作者:行者123 更新时间:2023-12-01 06:49:02 34 4
gpt4 key购买 nike

我正在尝试在 Jersey 中编写 RESTful Web 应用程序时管理竞争资源(如:数据库 session )。通常我会写这样的代码:

Session session = getSession();
try {
doWork();
session.commit();
} finally {
session.rollback(); // doesn't hurt after commit
session.release(); // or whatever
}

现在有了 Jersey,我有这样的资源:
@Path("/")
class MyResource {
@Path("{child}") public Child getChild(...) {
// how do I manage my session here ???
return child;
}
}

问题是我需要在 getChild() 中获取 session ,但是我无法确保在工作完成后正确释放它,因为我已经将控制权交还给了 Web 应用程序。

Child 也需要访问 session ,因此我无法将所有工作封装在一种方法中:
class Child {
@Path("{subchild}") public Subchild getSubchild(...) {
return new Subchild(session.get(...));
}
}

我无法将整个应用程序包装在 servlet 过滤器中,因为我需要来自 Jersey 级别的信息来构建我的 session 。现在我可以在 MyResource 中打开它,使用常规的 servlet 过滤器来确保我总是关闭它,但是我不知道何时回滚以及何时提交 session 。我可以使用 ExceptionMapper 来通知所有异常,但这需要是一个 ExceptionMapper,这看起来非常难看,概念上的 try/finally 分布在三个具有不同生命周期的类上等等。

在 Jersey 进行这种资源管理是否有“正确的方法”?我如何确保我正确关闭,例如资源和它的子位置使用它之后的 FileInputStream 吗?

最佳答案

在 REST 应用程序中,您不需要向调用传递任何内容。如果您在 getChild 中进行工作,那么所有逻辑都应该在那里。猜猜你在做什么,上面应该是:

@Path("/{childId}")
class ChildResource {

@GET
public Child getChild(@PathParam("childId") String childId) {
//Really, move this into a data access object
Session session = getSession();
try {
doWork();
session.commit();
} finally {
session.rollback();
// doesn't hurt after commit
session.release();
// or whatever
}
return child;
}
}

关于jersey - Jersey JAX-RS 中的异常处理/资源管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/951301/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com