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




Насколько я понимаю, вы можете принимать следующие форматы:
/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 с двумя логическими значениями? Будет ли это переключатель с четырьмя возможными случаями, связанными с логическими значениями?
Ну это вам решать, я не знаю, что делает метод. Вы уже передаете логическое значение в зависимости от значения первого поля. Что вы хотите сделать с параметром isOnlyActive. ?
Подожди, я скучаю по посту. Вы хотите принять новое значение для своего поля, а не новое поле, верно? Можете ли вы добавить в свой пост, о каких четырех утверждениях if / else вы говорите?>
Это абсолютно правильно. Под логикой переключения я имел в виду следующее: если нет addFields и onlyActive, то x; если есть addFields и нет onlyActive, то y; и так далее...
Что не ясно, так это то, является ли onlyActive новым параметром или это другое значение для параметра addFields. Какой из них правильный? /productId/freeTrial?addFields=includeDeleted&onlyActive=yes или /productId/freeTrial?addFields=includeDeleted,onlyActive
Извините, я не умею объяснять. /productId/freeTrial?addFields=includeDeleted,onlyActive, этот будет правильным
Не беспокойтесь, я думаю, теперь все ясно. Я отредактировал свой ответ, посмотрите, сработает ли он для вас.
Я бы так сильно за тебя проголосовал, будь у меня такая репутация. Большое спасибо за это, все сработало отлично
Это нормально, убедитесь, что у вас есть последняя версия моего ответа, я немного изменил ее за последние несколько минут, чтобы принять массив строк и проверить значение null.
Вы бы также передавали значение
onlyActiveкак логическое значение методуretrieveFreeTrialsByProductId?