如何 return 调用 Java 中的 api 异常消息?
How to return exception message to calling api in Java?
我有一个已经实现的控制器方法,它 return 是一个值或抛出异常。
@Override
@PostMapping(Endpoint.SUB_RESOURCE)
@ResponseStatus(HttpStatus.CREATED)
public EmployeeBankAccountOutputDto createBankAccount(@ApiParam("Account data") @RequestBody final EmployeeBankAccountInputDto accountCreationDto) {
try {
return service.createBankAccount(accountCreationDto);
} catch (InvalidAccountDataException ex) {
throw new InvalidAccountDataResponseException(ex, ex.getErrors());}
} catch (CountryNotFoundException ex) {
throw new CountryNotFoundResponseException(ex.getCountryCode(), ex);
}
}
在这段代码中,我只想记录警告级别的异常消息,而不是抛出异常,因为我不想看到类似 :
的内容
14:37:02,610 ERROR [] c.m.w.ApiExceptionHandler:135 - Account API error occurred: 400
所以如果我把
log.warn(ex.getMessage());
到第一个 catch 语句,它给出
missing return statement
该 catch 块正常出错。那么如何处理不抛出调用 api 异常并正确发送异常消息,因为方法的 return 类型是 dto?
如果您不从第一个 catch 块中抛出异常,并且在这种情况下抛出并捕获了异常,那么方法 return 应该是什么?
这就是您收到编译器错误的原因,因为没有 return 值,因为缺少 return 语句或未引发异常,这会导致执行流程突然停止,因此您可以执行以下操作:
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;
}
你 应该 理想地将 returned 对象包装在 ResponseEntity
中并添加消息和响应代码(正如 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);
}
如果无法创建帐户,您不想return什么都不做。
至少你想要 return 一个 400
错误响应来向客户端发出问题信号。
您可以使用 ResponseEntity
作为您方法的 return 类型来指示响应代码。这也意味着您也必须更改 return 成功案例中对象的方式。
如果您不想传输特定的错误消息而只想传输错误代码,则可以通过这种方式更改方法:
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());
}
}
当然,如果需要,您可以添加更多方法来处理更多类型的异常。
我有一个已经实现的控制器方法,它 return 是一个值或抛出异常。
@Override
@PostMapping(Endpoint.SUB_RESOURCE)
@ResponseStatus(HttpStatus.CREATED)
public EmployeeBankAccountOutputDto createBankAccount(@ApiParam("Account data") @RequestBody final EmployeeBankAccountInputDto accountCreationDto) {
try {
return service.createBankAccount(accountCreationDto);
} catch (InvalidAccountDataException ex) {
throw new InvalidAccountDataResponseException(ex, ex.getErrors());}
} catch (CountryNotFoundException ex) {
throw new CountryNotFoundResponseException(ex.getCountryCode(), ex);
}
}
在这段代码中,我只想记录警告级别的异常消息,而不是抛出异常,因为我不想看到类似 :
的内容14:37:02,610 ERROR [] c.m.w.ApiExceptionHandler:135 - Account API error occurred: 400
所以如果我把
log.warn(ex.getMessage());
到第一个 catch 语句,它给出
missing return statement
该 catch 块正常出错。那么如何处理不抛出调用 api 异常并正确发送异常消息,因为方法的 return 类型是 dto?
如果您不从第一个 catch 块中抛出异常,并且在这种情况下抛出并捕获了异常,那么方法 return 应该是什么?
这就是您收到编译器错误的原因,因为没有 return 值,因为缺少 return 语句或未引发异常,这会导致执行流程突然停止,因此您可以执行以下操作:
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;
}
你 应该 理想地将 returned 对象包装在 ResponseEntity
中并添加消息和响应代码(正如 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);
}
如果无法创建帐户,您不想return什么都不做。
至少你想要 return 一个 400
错误响应来向客户端发出问题信号。
您可以使用 ResponseEntity
作为您方法的 return 类型来指示响应代码。这也意味着您也必须更改 return 成功案例中对象的方式。
如果您不想传输特定的错误消息而只想传输错误代码,则可以通过这种方式更改方法:
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());
}
}
当然,如果需要,您可以添加更多方法来处理更多类型的异常。