Как я могу избегать использования исключений для управления потоком?

Из вернуть ok (). Build () вы только что вернули Http Status 200 OK Status. Не так ли?

Что именно вы должны вернуть клиенту?

Если это какой-то ответ, вы идете на return ResponseEntity.ok (). Build ( ) или

возвращают Response.ok (). Entity (someEntity) .build ();

и im вид возвращаемого типа - это ResponseEntity из кода.

Пожалуйста, сформулируйте проблему.

Редактировать:

Код будет выглядеть как

@PostMapping (value = "/ import")

public ResponseEntity<String> importRecipients(@ModelAttribute UserRecipientDto userRecipientDto,

        @CurrentUser @ApiIgnore User user, @RequestParam ImportType 

        importType, @RequestParam String name,

        @RequestParam List ids) {


    Collection count = this.service.getRecipients(userRecipientDto, importType, ids);


    UserMailRecipientGroup userMailRecipientGroup = new UserMailRecipientGroup(name, USER_RECIPIENT, count, user);


    userMailRecipientGroupService.saveMailRecipientGroup(userMailRecipientGroup);


    return new ResponseEntity(HttpStatus.OK);


}
9
задан tvanfosson 9 January 2009 в 15:28
поделиться

11 ответов

Это кажется, что Вы на самом деле хотите возвратить два объекта: код ответа и объект найдены. Вы могли бы рассмотреть создание легкой обертки, которая содержит обоих, и возвратите их вместе.

public class Pair<K,V>{
  public K first;
  public V second;
}

Затем можно создать новую Пару, которая содержит код ответа и данные. Как побочный эффект к использованию дженериков, можно затем снова использовать эту обертку для любой пары, в которой Вы на самом деле нуждаетесь.

Кроме того, если данные не истекли, Вы могли бы все еще возвратить их, но дать им 303 кода, чтобы позволить им знать, что это неизменно. 4xx ряд был бы соединен с null.

7
ответ дан 4 December 2019 в 08:35
поделиться

С данным требованием Вы не можете сделать этого.

При разработке контракта то добавьте условие и заставьте вызывающую сторону вызвать

exists(key): bool

Реализация услуги похожа на это:

if (exists(key)) {
    CustomObject o = get(key, ifModifiedSince);
    if (o == null) { 
      setResponseCode(302);
    } else {
      setResponseCode(200);
      push(o);
   }

} else {
      setResponseCode(400);
}

Клиент остается неизменным, и никогда не замечайте, что Вы проверили заранее.

Если Вы не разработали контракт, Вероятно, существует серьезное основание для этого, или вероятно это - только разработчик (или архитектор) отказ. Но так как Вы не можете изменить его, затем Вы не должны волноваться также.

Затем необходимо придерживаться спецификаций и продолжить двигаться как это:

 CustomObject o = get(key, ifModifiedSince);

 if (o != null) {
     setResponseCode(200);
     push(o);
  } else {
     setResponseCode(404); // either not found or not modified.
  }

Хорошо, Вы не отправляете 302 в этом случае, но вероятно который является способом, которым это было разработано.

Я имею в виду из соображений безопасности, сервер не должен возвращать больше информации, чем тот [датчик, добираются (ключ, дата) только возвращают или пустой указатель или объект]

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

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

Иногда, желая продолжиться право мы можем продолжить двигаться неправильно и поставить под угрозу безопасность нашего приложения.

Общайтесь со своей командой.

5
ответ дан 4 December 2019 в 08:35
поделиться

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

public bool exists( String key ) { ... }

Вызывающая сторона могла сделать:

if (exists(key)) {
   CustomObject modified = get(key,DateTime.Today.AddDays(-1));
   if (modified != null) { ... }
}

or

try {
    CustomObject modified = get(key,DateTime.Today.AddDays(-1));
}
catch (NotFoundException) { ... }
3
ответ дан 4 December 2019 в 08:35
поделиться

Можно создать специальный заключительный CustomObject как "маркер" для указания неизменный:

static public final CustomObject UNCHANGED=new CustomObject();

и тест для соответствия с "==" вместо .equals ().

Это могло бы также работать для возврата, пустой указатель на неизменном и выдавать исключение на не существует? Если бы я должен был выбрать один из Ваших 3, то я выбрал бы 1, потому что это кажется наиболее исключительным случаем.

3
ответ дан 4 December 2019 в 08:35
поделиться

Проблема за исключениями, они предназначены для передачи сигналов о "сбое быстро" сценарий (т.е. если не обработанный, исключение остановит приложение), из-за исключительного и аварийного поведения.

Я не думаю, что "сценарий, где ключ существует, но объект, не был изменен", исключительный, конечно, не аварийный.

Следовательно я не использовал бы исключение, а скорее я зарегистрирую действие, которое вызывающая сторона должна сделать для корректной интерпретации результата (свойство или специальный объект).

2
ответ дан 4 December 2019 в 08:35
поделиться

Насколько строгий требование для той сигнатуры метода?

Кажется, как будто Вы работаете над проектом, который все еще происходит. Если потребители Вашего класса являются другими разработчиками, можно ли убедить их, что сигнатура метода, которую они попросили, недостаточна? Возможно, они еще не поняли, что должно быть два уникальных вида отказа (ключ не существует, и объект не был изменен).

Я обсудил бы это с Вашим супервизором, если это - опция.

1
ответ дан 4 December 2019 в 08:35
поделиться

Я все еще возвратил бы пустой указатель.

Намерение свойства состоит в том, чтобы возвратить объект, который был изменен после указанной даты. Если возврат пустого указателя ни для какого объекта в порядке, затем конечно, возвращающийся пустой указатель для неизмененного объекта в порядке также.

Я лично возвратил бы пустой указатель для неизмененного объекта и выдал бы исключение для несуществующего объекта. Это кажется более естественным.

Вы совершенно правы для не использования исключений для управления потоком BTW, поэтому если у Вас только есть те 3 опции, Ваш инстинкт пищеварительного тракта является правильным.

1
ответ дан 4 December 2019 в 08:35
поделиться

(Намеченный) интерфейс относительно требований серьезно повреждается. Вы пытаетесь сделать несвязанные вещи в рамках одного метода. Это - дорога к аду программного обеспечения.

1
ответ дан 4 December 2019 в 08:35
поделиться

Вы могли следовать за шаблоном библиотеки .NET и иметь общедоступное статическое поле только для чтения в пользовательском объекте под названием CustomObject. Пустой, который имеет тип CustomObject (как строка. Пустой и Гуид. Пустой). Вы могли возвратить это, если объект не будет изменен (то функциональный потребитель должен будет выдержать сравнение с ним).
Править: Я только что определил это, Вы работаете в Java, но принцип все еще применяется

Это дает Вам опцию следующего

  • Возвратите пустой указатель, если ключ не существует.

  • Возвратите CustomObject. Пустой, если ключ существует, но объект не был изменен.

Недостаток состоит в том, что потребитель должен был бы знать различие между пустым возвращаемым значением и CustomObject. Пустое возвращаемое значение.

Возможно, свойство более точно назвали бы CustomObject. NotModified, столь Пустой, действительно предназначается для типов Значения, как они не могут быть пустыми. Также NotModified передал бы значение поля более легко потребителю.

1
ответ дан 4 December 2019 в 08:35
поделиться

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

У Вас есть интерфейс своего класса, определяют различные ошибки, которые могут произойти, передающий в CustomObject как параметр для события, в случае необходимости.

public interface Callback {
  public void keyDoesNotExist();
  public void notModified(CustomObject c);
  public void isNewlyModified(CustomObject c);
  .
  .
  .
}

Таким образом Вы позволяете конструктору Интерфейса обратного вызова определять, что сделать, когда событие имеет место, и можно выбрать через интерфейс, обусловливает ли это, требует передачи найденного объекта. Наконец, это уменьшает сложность логики по возврату. Ваш метод делает это однажды. Конструкторы API не требуют выполнения его вообще, поскольку это сделано для них.

1
ответ дан 4 December 2019 в 08:35
поделиться

Если это приемлемо, можно возвратить усиленный CustomObject (обертка), который содержал значения, которые представили объект и его состояние модификации, если таковые имеются, и т.д.

0
ответ дан 4 December 2019 в 08:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: