当前位置: 首页 > 知识库问答 >
问题:

如何在Java中向调用api返回异常消息?

凌钊
2023-03-14

我已经实现了一个返回一个值或者抛出一个异常的控制器方法。

@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(例如getMessage())到第一个catch语句,它给出

缺少返回语句

该catch块的错误。所以,如何处理不向调用api抛出异常,只正确发送异常消息,因为方法的返回类型是dto?

共有2个答案

逄岳
2023-03-14

如果你没有从第一个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;
}

理想情况下,您应该将返回的对象包装在< code>ResponseEntity中,并添加一条消息

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);
 }
淳于慎之
2023-03-14

如果无法创建帐户,您不希望返回任何内容
至少您希望返回400错误响应,以向客户端发出问题信号。

您可以使用< code>ResponseEntity作为方法的返回类型,以发出响应代码。这也意味着在成功的情况下,你也必须改变返回对象的方式。< br >如果您不想发送特定的错误信息,而只想发送错误代码,您可以通过这种方式更改方法:

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());
    } 
}

请注意,如果您需要在多个控制器中执行此处理,这可能意味着异常处理程序将是一种更简洁的方法。
例如,以统一的方式处理InvalidAcCountDataExc的

@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());      
    }

}

如果需要,您可以添加更多方法来处理更多类型的异常。

 类似资料:
  • 当我点击像这样的API时,我想要一个图像 当我点击这个API时,它将返回给我一个图像。

  • 我似乎无法在javascript中将这个API调用的值返回到我的react组件。我有一个调用API的java脚本文件。在 js 文件中,返回结果,但是当我在 react 组件中调用 usingEffect 中的 js 函数时,它返回未定义。 这是我的rect组件 导出默认函数OrdersChart() { ........ 变量有效负载为空

  • 问题内容: 我如何使这个小功能“ imageExists”返回ajax请求是否成功? 问题答案: 我相信您将必须使用同步模式并使用单独的变量来存储返回值。

  • 问题内容: 我在自己的类中拥有所有异步调用,因此我不想将aync’ly设置为全局变量。为此,我想从我的asunc postProcess方法返回对象,例如字符串。 能做到吗? 下面是我类的一般结构,例如,我想从onPostExecute()返回一个字符串。我看到在其他地方提到了委托,但这似乎很混乱,确定有办法为类或方法提供返回类型吗? 问题答案: 像下面这样 和听众课 你可以这样打电话

  • 问题内容: 我有一个发出异步请求的函数。我如何从中返回响应/结果? 我尝试从回调中返回值,以及将结果分配给函数内部的局部变量并返回该局部变量,但这些方法均未真正返回响应(它们都返回或变量的初始值为任意值) 。 使用jQuery函数的示例: 使用node.js的示例: 使用承诺块的示例: 问题答案: 在 一 中的Ajax代表 异步 。这意味着发送请求(或接收响应)已从正常执行流程中删除。在您的示例中

  • 使用promise的块的示例: