Http-сервер Джерси: добавление параметров для каждого метода http - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть 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;

}

Поэтому я хочу, чтобы фильтр добавил параметр Connection для каждого метода и чтобы этот фильтр автоматически обрабатывал транзакции (например, принятие, откат при исключении и т. Д.)..)

Я уже сейчас знаю, как добавить фильтры на мой Http-сервер в Джерси, а также знаю, кто должен обрабатывать необработанные исключения.Но я понятия не имею, как я могу добавить пользовательские параметры для каждого метода и получить доступ к этим параметрам в обработчике исключений.

1 Ответ

0 голосов
/ 10 декабря 2018

Не стоит решать эту проблему, добавляя параметры в ресурсы JAX-RS, потому что это не имеет к этому никакого отношения.

В методах ресурсов JAX-RS вы должны только читать ипроверьте параметры запроса, а затем передайте запрошенную задачу другому классу, выполняющему операции с базой данных.

Кроме того, вы, возможно, должны работать с пулом соединений с базой данных вместо создания нового для каждого вызова, если это больше, чем упражнение.(Но не создавайте пул самостоятельно.)

Чтобы добавить небольшой практический совет: вы можете позволить своим классам ресурсов расширять базовый класс с помощью контекстно-аннотированного метода , который затем вызывается до запрашиваемого точного метода ресурса :

public class BaseResource {

   protected Object someVar;

  @Context
  public void setServletContext( ServletContext servletContext ) {
      someVar = ...;
  }
}

Таким образом, для каждого из ваших методов ресурса будет установлен someVar.

Как уже говорилось, я бы не стал использовать это для такой сложной вещи, как транзакция базы данных.

...