Ведение констант пути для RestControllers - PullRequest
1 голос
/ 21 марта 2019

Я хотел бы знать, каков общий стиль для поддержания констант пути для Rest Controllers. Например, у вас есть что-то вроде этого:

@RequestMapping(method = RequestMethod.GET, value = ANY_PATH_VALUE)

Я поддерживаю эти константы (в примере ANY_PATH_VALUE) в данный момент в классе с именем PathConstants, который выглядит следующим образом:

public abstract class PathConstants {
    public static final String ANY_PATH_VALUE = "/path/{SOME_ID}";
    ...
}

Это обычный способ хранить эти значения прямо в методе класса RestController или это так, как я делаю в настоящее время? Или есть еще более распространенный способ поддержания такого рода вещей?

Ответы [ 3 ]

2 голосов
/ 21 марта 2019

У этого есть две стороны,

На самом деле проблема с производительностью близка к нулю.Это имеет отношение к чему-то с читабельностью .

  • Первое представление - сохранять значения в виде собственных строк в контроллерах.
    Это более читабельно в том смысле, что вы можете напрямую проверять точный маршрут API при входе в контроллер.
  • Второе представление хранит его в каком-то другом файле с static константами.
    Сохранение всех таких маршрутов фактически дает вам одно общее место, где вы можете узнать все маршруты API, которые вы в настоящее время поддерживаете в своем приложении.


Я лично предпочитаю второй, т.е. хранить все пути в файле с именем APIRoutes и далее разделить на домены.

public class APIRoutes {

    public class SYSTEM {
         public static final String HEALTH_CHECK = "api/v1/healthcheck";
         public static final String LB_HEALTH_CHECK = "lb/v1/healthcheck";
    }

    public class API {
         public static final String SAVE_X = "api/v1/save";
         public static final String GET_X = "api/v1/get";
    }

    public class CACHE {
         public static final String RELOAD_X = "cache/v1/load/x";
         public static final String RELOAD_Y = "cache/v1/load/y";
    }

}

Таким образом, в вашем контроллере , у вас естьчто-то вроде

@RequestMapping(method = RequestMethod.GET, value = APIRoutes.API.SAVE_X)
0 голосов
/ 21 марта 2019

Использование констант представляется вполне разумным подходом . Однако я бы определил константы в классе final с помощью конструктора private, который выбрасывает AssertionError, чтобы обеспечить непостоянную :

public final class PathConstants  {

    // Suppress default constructor for noninstantiability
    private PathConstants() {
        throw new AssertionError("No instances for you!");
    }

    public static final String PATH_TO_FOO = "foo";
    public static final String PATH_TO_BAR = "bar";
}

Цитирование пункта 4 из книги «Эффективная Ява» 3 rd издание Джошуа Блоха:

Поскольку явным конструктором является private, он недоступен вне класса. AssertionError не является строго обязательным, но он обеспечивает страховку на случай, если конструктор случайно вызван из класса. Это гарантирует, что класс никогда не будет создан ни при каких обстоятельствах. Эта идиома слегка нелогична, потому что конструктор предоставлен явно, чтобы его нельзя было вызвать. Поэтому целесообразно добавить комментарий, как показано ранее.

В качестве побочного эффекта, эта идиома также предотвращает подкласс класса. Все конструкторы должны вызывать конструктор суперкласса, явно или неявно, и у подкласса не будет доступного конструктора суперкласса для вызова.


Вы также можете использовать что-то вроде @RequestMapping("${foo.bar}"), где foo.bar - это значение, определенное в свойстве souce (например, файл application.properties или вариант YAML).

Цитирование Spring MVC документации :

Шаблоны путей URI также могут иметь встроенные ${…​} заполнители, которые разрешаются при запуске с использованием PropertyPlaceHolderConfigurer для локальных, системных, сред и других источников свойств. Это можно использовать, например, для параметризации базового URL-адреса на основе некоторой внешней конфигурации.

0 голосов
/ 21 марта 2019

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

public static final String VERSION_1 = "/v1";
public static final String USERS_V1 = VERSION_1 + "/users";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...