Я занимаюсь разработкой Spring-boot REST API. Пользователь введет свой пароль, и моя обязанность - ввести введенный пользователем пароль и попытаться подключиться к системе. Если это не работает, то есть набор паролей по умолчанию, которые я могу использовать из базы данных для установления соединения.
Если успешное соединение установлено, я возвращаю ответ с системной информацией вместе с обновленным паролем.
Местное время:
В моей машине API работает, как ожидалось. Если я введу неправильный пароль, API попытается установить соединение, после возникновения исключения мой API автоматически повторяет попытку с другим паролем и продолжает пытаться использовать все имеющиеся у него пароли. Если это удается, я получаю сообщение об ошибке или сообщение об ошибке.
На сервере:
Когда я даю правильный пароль, он работает как положено.
Когда я даю неправильный пароль, я продолжаю ждать и, наконец, получаю исключение в пользовательском интерфейсе с кодом состояния 1000 и GenericException.
Вот что я сделал до сих пор ...
Мне нужно выполнить несколько предварительных шагов, я создал класс util для выполнения этих предварительных шагов.
Например:
//Collects default passwords that might work.
public void fetchPasswordsFromDB(Request request){}
//From the list of passwords from the database, retry and iterate to next passwords on failures
public boolean setNextPassword (Request request){}
Приведенный выше метод получит пароли по умолчанию и установит их в запросе.
Тогда в мой запрос войдет другой класс, отвечающий за установление соединения с какой-либо системой.
Если мы не можем подключиться к системе, я пытаюсь подключиться со следующим доступным паролем.
Я продолжаю повторять попытки, пока не исчерпаю пароли.
Наконец, если я подключусь, я верну ответ обратно во внешний интерфейс вместе с ответом, который я получил.
Я поместил механизм повторных попыток в блок перехвата, потому что моя служба выдает исключение, если пароль неправильный, поэтому я ловлю исключение и повторяю оттуда.
public class Utility {
//Collects default passwords that might work.
public void fetchPasswordsFromDB(Request request){}
//From the list of passwords from the database, retry and iterate to next passwords on failures
public boolean setNextPassword (Request request){}
}
public class SystemConnService {
@Autowired
private SystemConnectionHelper helper;
@Autowired
private Utility util;
public ResponseEntity<ResponseObject> getConnection(Request request) {
String connection = null;
try {
util.fetchpasswordsFromDB(request);
connection = helper.connectSystems(request);
} catch (CustomException ex) {
return new ResponseEntity<ResponseObject>(new Object, FAILURE_REASON_CODE);
}
return ResponseEntity<ResponseObject>(new ObjectWithConnection, SUCCESS_REASON_CODE);
}
}
@Component
public class SystemConnectionHelper {
private String connectSystems(Request request, boolean retry) throws CustomException {
String systemResponse = null;
try {
systemResponse = executeRequest(request.getPassword);
} catch (CustomException) {
if(retry) {
systemResonse = connectSystems(request, util.setNextPassword(request));
}
return systemResponse;
}
}
Ожидается, что мой API всегда должен возвращать ответ обратно в пользовательский интерфейс, независимо от обработки, происходящей внутри.
Пользовательский интерфейс получает этот ответ: {"responseCode": 1000, "responseText": "Generic.exception.message"}
ОБНОВЛЕНИЕ: После дальнейшего тестирования, когда я отправляю два-три запроса одновременно на мой контроллер, по истечении определенного времени я получаю исключение NullPointerException обратно в пользовательский интерфейс с кодом причины 500. Я пытался перехватить исключение NullPointerException везде, где есть в моем коде, но я не думаю, что оно перехватывается. К сожалению, я получаю это откуда-то из бэкэнда, я не могу понять, когда и куда его бросают.