Как вернуть сообщение об исключении для вызова API в Java?

Вы можете использовать regex .

В вашем примере это будет:

db.stuff.find( { foo: /^bar$/i } );

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

1
задан Chris Garsonn 18 January 2019 в 13:45
поделиться

2 ответа

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

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

public ResponseEntity<EmployeeBankAccountOutputDto> createBankAccount(@ApiParam("Account data") @RequestBody final EmployeeBankAccountInputDto accountCreationDto) {

    try {
        return  ResponseEntity.ok(service.createBankAccount(accountCreationDto));
    } catch (InvalidAccountDataException ex) {
      log.warn(ex.getMessage());
      return ResponseEntity.badRequest();
    } 
}

Если вы также хотите передать конкретное сообщение об ошибке, вы можете использовать тело Ответ:

public ResponseEntity<EmployeeBankAccountOutputDto> createBankAccount(@ApiParam("Account data") @RequestBody final EmployeeBankAccountInputDto accountCreationDto) {

    try {
        return  ResponseEntity.ok(service.createBankAccount(accountCreationDto));
    } catch (InvalidAccountDataException ex) {
      log.warn(ex.getMessage());
      return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage());
    } 
}

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

@ControllerAdvice
public class MyExceptionHandler extends ResponseEntityExceptionHandler {

    Logger LOGGER = LoggerFactory.getLogger(MyExceptionHandler.class);

    @ExceptionHandler(value = { InvalidAccountDataException.class })
    protected ResponseEntity<Object> handleGenericExceptions(InvalidAccountDataException ex, WebRequest request) {
        log.warn(ex.getMessage());
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage());      
    }

}

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

0
ответ дан davidxxx 18 January 2019 в 13:45
поделиться

Если вы не выбросите исключение из 1-го блока catch, и в этом случае будет сгенерировано и перехвачено исключение, что должен вернуть метод?

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

public EmployeeBankAccountOutputDto createBankAccount(@ApiParam("Account data") @RequestBody final EmployeeBankAccountInputDto accountCreationDto) {
       EmployeeBankAccountInputDto employeeBankAccountInputDto = null;
       try {
            employeeBankAccountInputDto = service.createBankAccount(accountCreationDto);
       } catch (InvalidAccountDataException ex) {
          log.warn(ex.getMessage()); 
       } catch (CountryNotFoundException ex) {
           throw new CountryNotFoundResponseException(ex.getCountryCode(), ex);
       }
       return employeeBankAccountInputDto;
}

Вы должны идеально обернуть возвращаемый объект в ResponseEntity и добавить сообщение & amp; Код ответа (как поясняет davidxxx в своем комментарии).

public ResponseEntity<EmployeeBankAccountOutputDto> createBankAccount(@ApiParam("Account data") @RequestBody final EmployeeBankAccountInputDto accountCreationDto) {
       EmployeeBankAccountInputDto employeeBankAccountInputDto = null;
       try {
            employeeBankAccountInputDto = service.createBankAccount(accountCreationDto);
       } catch (InvalidAccountDataException ex) {
            log.warn(ex.getMessage()); 
            return new ResponseEntity(employeeBankAccountInputDto, HttpStatus.BAD_REQUEST);
       } catch (CountryNotFoundException ex) {
            throw new CountryNotFoundResponseException(ex.getCountryCode(), ex);
       }
       return new ResponseEntity(employeeBankAccountInputDto, HttpStatus.OK);
 }
0
ответ дан Amardeep Bhowmick 18 January 2019 в 13:45
поделиться
Другие вопросы по тегам:

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