Java Jersey Http服务器:向每个Http方法添加参数

Java Jersey Http服务器:向每个Http方法添加参数,java,http,exception,transactions,jersey,Java,Http,Exception,Transactions,Jersey,我有一个Jersey Http服务器,希望优化我的代码。我遇到的一个问题是,我在每个方法中都有几乎相同的手动事务处理。这就是一种典型的方法: @POST @Path("/create") public Response create(String taskJson) { Connection connection = null; try (MySqlConnection mySqlConnection = new MySqlConnection()) { con

我有一个Jersey Http服务器,希望优化我的代码。我遇到的一个问题是,我在每个方法中都有几乎相同的手动事务处理。这就是一种典型的方法:

@POST
@Path("/create")
public Response create(String taskJson) {

    Connection connection = null;
    try (MySqlConnection mySqlConnection = new MySqlConnection()) {
        connection = mySqlConnection.getDbConnection();
        connection.setAutoCommit(false);

        // Add some data to the database with SQL-Statements...

        connection.commit();
        return result;

    } catch (Exception e) {
        connection.rollback();
        Logger.getInstance().logError(LOG_TAG, "Unexpected Error", e);
        return error;
    }

}
因此,数据库事务处理非常烦人,每个方法中都有重复的代码。我希望我的方法如下所示:

@POST
@Path("/create")
public Response create(String taskJson, @AddedPerJerseyMagicToMyMethod Connection connection) {

        // Add some data to the database with SQL-Statements...

        return result;

}
因此,我希望过滤器向每个方法添加一个连接参数,并自动处理事务(如提交、异常时回滚等)


我现在已经知道如何向Jersey Http服务器添加过滤器,并且知道由谁来处理未捕获的异常。但是我不知道如何向每个方法添加自定义参数并在异常处理程序中访问这些参数。

通过向JAX-RS资源添加参数来解决这个问题不是一个好主意,因为这与此无关

在JAX-RS资源方法中,您应该只读取和验证请求参数,然后将请求的任务交给执行数据库操作的其他类

此外,如果这不仅仅是一个练习,那么您可能应该使用一个数据库连接池,而不是为每个调用创建一个新的数据库连接池。(但不要自己实现池。)

添加一点实用提示:您可以让资源类使用上下文注释的方法扩展基类,然后在acutal请求的资源方法之前调用该方法:

public class BaseResource {

   protected Object someVar;

  @Context
  public void setServletContext( ServletContext servletContext ) {
      someVar = ...;
  }
}
这样,您的每个资源方法都将设置
someVar


如前所述,我不会将其用于数据库事务这样复杂的事情。

谢谢您的回答。“在JAX-RS资源方法中,您应该只读取和验证请求参数,然后将请求的任务交给另一个执行数据库操作的类。”您是否有这样的示例,或者我可以从中了解到一些信息的源代码?是否还有注释(如@Context)对于在资源方法之后调用的方法,在版本2中的JAX-RS中添加了一些东西:“过滤器和拦截器”被添加到规范中。我个人不知道这些,因为我仍然坚持使用JAX-RS 1(!):-),但听起来值得一看。奥莱利的书摘录: