Определение типов подклассов с помощью атрибута

У меня следующая иерархия классов

Promotion   -  abstract
  - Coupon
  - Sales
  - Deals

(Купоны, Продажи и Сделки - это подклассы Рекламной акции).

и хотел бы определить тип объекта при обмене данными между REST API (JSON) и клиентом (Angular). Пользователи могут отправить Купон, Иметь дело или Распродажа. Например, когда клиент отправляет купон, я хочу знать, что это купон, чтобы я мог вызвать правильный метод.

Чтобы решить эту проблему, я объявил переменную и абстрактный метод в разделе «Продвижение».

protected String promotionType = getPromotionType();
protected abstract String getPromotionType(); 

В подклассах, например, в Купон у меня есть что-то вроде этого

protected String getPromotionType() {
        return "coupon"
       // OR  return this.getClass().getSimpleName().toLowerCase();
    }

Это автоматически инициализирует переменную PromotionType, чтобы в контроллерах я мог проверить, является ли объект Купон, Продажи или Иметь дело. Помните, что JSON отправляет данные в строковых форматах, поэтому у меня должен быть способ определить тип прибывающего объекта.

В этом случае у меня будет один контроллер для обработки всех моих операций CRUD. В моем методе контроллера я сделаю что-то вроде:

@PostMapping public void create(@RequestBody Promotion){

     // And inside here I will check the type of **promotionType**

}

Здесь я использую Продвижение в качестве аргумента вместо любого из подклассов в методе Создайте().

Мой вопрос: это лучший способ решить эту проблему?

Или мне нужно создать отдельный контроллер для каждого подкласса? Я ищу лучший способ сделать это в реальном мире.

Я использую Hibernate для своих сопоставлений.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
61
1

Ответы 1

My question is, is it the best way to solve this?

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

Or do i have to create a separate Controller for each of the subclass?

Нет, не обязательно. Если код и, вероятно, останусь простой - иногда вы можете это предвидеть - нет смысла раздувать код. Наличие трех Controllers вместо одного PromotionController, скорее всего, увеличит избыточный код. В противном случае, если подклассы довольно разнородны, было бы целесообразнее использовать три контроллера.

Другая мысль: у вас может быть (человеческий) клиент, который управляет только Deals, и у этого клиента есть особые требования, ведущие к кучке настраиваемых интерфейсов отдыха только для Deal, вы, вероятно, захотите иметь отдельный Controller.

I am looking for the best way to do it in the real world.

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

Лучший способ - обсудить это в команде, выработать здравый смысл и, если не уверены, позволить ведущему архитектору решить, какой путь двигаться. Имо, твой подход кажется вполне нормальным. Это мои 2 цента.

Спасибо за ответ. Приложение представляет собой сайт купонов и предложений, где пользователи будут отправлять купоны, предложения или продажи продуктов.

Eddy Freeman 26.05.2018 11:37

Другие вопросы по теме