Логика кода для управления @RequestParam с разными параметрами

Я создаю сервис для получения данных

@RequestMapping(value = "/{productId}/freeTrial", method = RequestMethod.GET)
@ResponseBody
public RestResponse<List<RetrieveFreeTrialResponse>> retrieveServiceFreeTrialsByProductIdWithParam(
        @PathVariable String productId,
        @RequestParam(value = "addFields", required = false) String field) {
    if ("includeDeleted".equals(field)) {
        return retrieveFreeTrialsActivity.retrieveFreeTrialsByProductId(productId, true);
    } else {
        return retrieveFreeTrialsActivity.retrieveFreeTrialsByProductId(productId, false);
    }
}

Я работал либо без параметров, либо с includeDeleted. Теперь я должен добавить возможность для addFields также принимать другое значение: onlyActive.

Есть ли способ избежать написания 4 операторов if / else для возврата правильного метода в зависимости от того, какие параметры я передаю URL-адресу? Кроме того, я предполагаю, что "String field" следует изменить на String[] field, верно?

Допустимые запросы:

/productId/freeTrial?addFields=includeDeleted,onlyActive
/productId/freeTrial?addFields=includeDeleted
/productId/freeTrial?addFields=onlyActive
/productId/freeTrial

Вы бы также передавали значение onlyActive как логическое значение методу retrieveFreeTrialsByProductId?

Bentaye 06.04.2018 17:12

так что теперь вы можете иметь и onlyActive, и includeDeleted одновременно, верно? или всегда только один из них?

Ruslan Akhundov 06.04.2018 17:13

@Ruslan Akhundov Так что я могу иметь их обоих (или больше, если я когда-нибудь добавлю больше полей) одновременно. Логическое значение просто передается, чтобы знать, какую часть оператора if / else в retrieveFreeTrialsByProductId я хочу использовать (да, я знаю, что это запах кода, но я буду работать над этим позже), поэтому я предполагаю, что это также может быть String.

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

Ответы 1

Ответ принят как подходящий

Насколько я понимаю, вы можете принимать следующие форматы:

/productId/freeTrial?addFields=includeDeleted,onlyActive
/productId/freeTrial?addFields=includeDeleted
/productId/freeTrial?addFields=onlyActive
/productId/freeTrial

Получите addFields в виде массива String. Затем вычислите значение логического, которое вы хотите передать, и вызовите свой метод с вашим логическим значением.

В приведенном ниже примере я предполагаю, что вы хотите отправить true, только если includeDeleted присутствует, а onlyActive нет. Вы можете реализовать любой алгоритм, какой захотите.

  @RequestMapping(value = "/{productId}/freeTrial", method = RequestMethod.GET)
  @ResponseBody
  public String retrieveServiceFreeTrialsByProductIdWithParam(
      @PathVariable String productId,
      @RequestParam(value = "addFields", required = false) String[] addFields) {

    List<String> addFieldsList = new ArrayList<>();
    if (addFields!=null)
      addFieldsList = Arrays.asList(addFields);  

    boolean isIncludeDeleted = addFieldsList.contains("includeDeleted");
    boolean isOnlyActive = addFieldsList.contains("onlyActive");

    // here you define your algorithm
    boolean b = isIncludeDeleted && isOnlyActive;

    return retrieveFreeTrialsActivity().retrieveFreeTrialsByProductId(productId, b);
  }

Как будет выглядеть логика внутри retrieveFreeTrialsByProductId с двумя логическими значениями? Будет ли это переключатель с четырьмя возможными случаями, связанными с логическими значениями?

Vclaps 09.04.2018 09:52

Ну это вам решать, я не знаю, что делает метод. Вы уже передаете логическое значение в зависимости от значения первого поля. Что вы хотите сделать с параметром isOnlyActive. ?

Bentaye 09.04.2018 10:03

Подожди, я скучаю по посту. Вы хотите принять новое значение для своего поля, а не новое поле, верно? Можете ли вы добавить в свой пост, о каких четырех утверждениях if / else вы говорите?>

Bentaye 09.04.2018 10:06

Это абсолютно правильно. Под логикой переключения я имел в виду следующее: если нет addFields и onlyActive, то x; если есть addFields и нет onlyActive, то y; и так далее...

Vclaps 09.04.2018 10:16

Что не ясно, так это то, является ли onlyActive новым параметром или это другое значение для параметра addFields. Какой из них правильный? /productId/freeTrial?addFields=includeDeleted&onlyActive=yes или /productId/freeTrial?addFields=includeDeleted,onlyActive

Bentaye 09.04.2018 10:24

Извините, я не умею объяснять. /productId/freeTrial?addFields=includeDeleted,onlyAct‌​ive, этот будет правильным

Vclaps 09.04.2018 10:31

Не беспокойтесь, я думаю, теперь все ясно. Я отредактировал свой ответ, посмотрите, сработает ли он для вас.

Bentaye 09.04.2018 10:41

Я бы так сильно за тебя проголосовал, будь у меня такая репутация. Большое спасибо за это, все сработало отлично

Vclaps 09.04.2018 10:53

Это нормально, убедитесь, что у вас есть последняя версия моего ответа, я немного изменил ее за последние несколько минут, чтобы принять массив строк и проверить значение null.

Bentaye 09.04.2018 10:54

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