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

@ExceptionHandler在REST API中自动绑定失败时不工作

尉迟轶
2023-03-14

我有两个REST API的GET POST

当方法中抛出任何异常时,异常处理程序工作正常。但如果我使用格式错误的REST api uri,那么它只显示400错误请求,而不会转到异常处理程序。

Eg.

如果我http://localhost:8080/mypojoInteger/abc,它无法将字符串解析为整数,因此我希望它转到ExceptionHandler。它不会转到异常处理程序,相反,我只看到400个错误请求。

它工作正常,并在GET/POST方法中抛出任何异常时转到异常处理程序。

例如:如果我在path变量中使用123,它工作正常并转到异常处理程序http://localhost:8085/mypojoInteger/123

并将getData方法更改为

 @GetMapping("/mypojoInteger/{sentNumber}")
    public void getData(@PathVariable("sentNumber") Integer sentNumber) {
    throw new NumberFormatException("Exception");    
    }

注意:POST请求也存在同样的问题。

  1. 获取:
   @GetMapping("/mypojoInteger/{sentNumber}")
   public void getData(@PathVariable("sentNumber") Integer sentNumber) {
   //some code    
   }
 public void postData(@RequestBody MyPojo myPojo) {
    //some code
  }

控制器建议类:

@ControllerAdvice
public class CustomGlobalExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(NumberFormatException.class)
    protected ResponseEntity<Object> handleEntityNotFound(
            NumberFormatException ex) {

         // some logic
    }
}

当它未能将字符串绑定到REST API uri本身中的整数时,我如何处理异常??

编辑:我的要求是我应该处理整数的溢出值,即,如果传递超过整数的最大值,它必须处理它,而不是抛出NumberFormatException堆栈跟踪。

当我通过流量值时

POJO:

public class MyPojo extends Exception {

    private String name;

    private Integer myInt;

//getters/setter
}
{
    "name":"name",
    "myInt":12378977977987879
}

没有@ControllerAdvice,它只显示NumberFormatException堆栈跟踪。对于@ControllerAdvice,它只显示400个错误请求,没有响应实体。在这种情况下,我不希望出现默认的stacktrace/400错误请求,但我希望显示我的自定义消息。

共有3个答案

巫懿轩
2023-03-14

解决方案:

我发现我需要处理错误的请求。所以,我有覆盖

@Override
    protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
    //Handle Bad Request
    }
严宏旷
2023-03-14

问题是因为对象未作为有效的请求参数发送,请求示例:5如果发送字符串,将直接引发异常。如果要检查它是字符串还是整数,可以通过以下方式更改代码

@GetMapping("/mypojoInteger/{sentNumber}")
public void getData(@PathVariable("sentNumber") Object sentNumber) {
    if (!(data instanceof Integer)) {
        throw new NumberFormatException("Exception");    
    }        
}

这应该适用于您的示例。

鲍国兴
2023-03-14

我看到的原因是,因为您的请求本身格式不正确-

 类似资料:
  • 问题内容: 我正在尝试将套接字绑定到以下端口: 但是它给出: 为什么会发生此错误? 问题答案: 该错误通常表示您尝试打开的端口已被另一个应用程序使用。尝试使用netstat查看哪些端口已打开,然后使用可用端口。 还检查您是否绑定到正确的IP地址(我假设它是本地主机)

  • 我正在尝试将套接字绑定到以下端口: 但它给出: 为什么会出现这个错误呢?

  • 我的Spring Boot服务将执行一项工作,并在成功后退出0(没有restcontroller),但我也希望它在每个异常时退出,因此我在类上添加了并放置了以下方法: 一切正常,但当我抛出一个IllegalArgumentException时,方法不会被调用。首先,我有一个没有参数的void方法,然后我开始尝试使用字符串返回和至少一个参数--这是不需要的。 这怎么行?有没有更好的方法让我的案例对每

  • 我在下面的代码中创建了一个表: 此外,我有记录从csv文件导入到表。我想插入一个新的记录到表我一直得到这个错误 错误:重复的键值违反了唯一约束"salesorderdetail_pkey"DETAIL: Key(SalesorderDetid)=(2)已经存在。********** 错误 ********** 错误:重复的键值违反唯一约束“salesorderdetail_pkey”SQL状态:2

  • 我对spring JPA、Hibernate、MySQL有一个问题。我有一个实体(nom.java)和存储库(公共接口NomRepository扩展了JpaRepository)。它们被创造和注入都很好。 问题是,当我试图通过Repository的save方法保存一个记录时,spring抱怨说“表''不存在”。事实上,我在MySQL中看不到这个表。您尝试了不同值的hibernate.hbm2ddl

  • [编辑] 我在没有添加行的情况下出现了这个错误: 在添加kapt“com.android.databinding:compiler:$android_plugin_version”之后: