Spring boot @当REST API中的自动绑定失败时,ExceptionHandler不工作
我有两个REST API的GET POST 当在方法内部抛出任何异常时,异常处理程序工作正常。 但若我使用格式错误的RESTAPI uri,那个么它只会显示400个错误请求,而不会转到异常处理程序 例如 若我点击,它将无法将字符串解析为整数,因此我希望它转到ExceptionHandler。 它不会转到异常处理程序,相反,我只看到400个错误的请求 当GET/POST方法中抛出任何异常时,它工作正常并转到异常处理程序 例如:如果我在path变量中使用123,它工作正常并转到异常处理程序 并将getData方法更改为Spring boot @当REST API中的自动绑定失败时,ExceptionHandler不工作,spring-boot,spring-mvc,Spring Boot,Spring Mvc,我有两个REST API的GET POST 当在方法内部抛出任何异常时,异常处理程序工作正常。 但若我使用格式错误的RESTAPI uri,那个么它只会显示400个错误请求,而不会转到异常处理程序 例如 若我点击,它将无法将字符串解析为整数,因此我希望它转到ExceptionHandler。 它不会转到异常处理程序,相反,我只看到400个错误的请求 当GET/POST方法中抛出任何异常时,它工作正常并转到异常处理程序 例如:如果我在path变量中使用123,它工作正常并转到异常处理程序 并将g
@GetMapping("/mypojoInteger/{sentNumber}")
public void getData(@PathVariable("sentNumber") Integer sentNumber) {
throw new NumberFormatException("Exception");
}
注意:POST请求也存在同样的问题
@ControllerAdvice
public class CustomGlobalExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(NumberFormatException.class)
protected ResponseEntity<Object> handleEntityNotFound(
NumberFormatException ex) {
// some logic
}
}
没有@ControllerAdvice,它只显示NumberFormatException堆栈跟踪。
使用@ControllerAdvice,它只显示400个错误请求,没有响应实体。
在这种情况下,我不希望出现此默认stacktrace/400错误请求
但是我想显示我的自定义消息。我看到的原因是,由于您的请求本身格式不正确->方法体从未执行过-因此不会发生异常,因为它只用于处理方法中的错误。对于您来说,形成一个适当的请求主体可能是一个更好的设计选择,而不是允许它执行任何方法,这样您就可以事先知道问题所在。我看到的原因是,因为您的请求本身的格式不正确->方法体永远不会执行-因此不会发生异常,因为它只用于处理方法中的错误。对于您来说,形成一个适当的请求主体可能是一个更好的设计选择,而不是允许它执行任何方法,以便您事先知道问题。问题是因为
Integer
对象未作为有效请求参数发送,请求示例:5如果发送字符串,将直接引发异常。如果要检查它是字符串还是整数,可以通过以下方式更改代码:
@GetMapping("/mypojoInteger/{sentNumber}")
public void getData(@PathVariable("sentNumber") Object sentNumber) {
if (!(data instanceof Integer)) {
throw new NumberFormatException("Exception");
}
}
这应该适用于您的示例。问题是因为Integer
对象未作为有效请求参数发送,请求示例:5如果发送字符串,将直接引发异常。如果要检查它是字符串还是整数,可以通过以下方式更改代码:
@GetMapping("/mypojoInteger/{sentNumber}")
public void getData(@PathVariable("sentNumber") Object sentNumber) {
if (!(data instanceof Integer)) {
throw new NumberFormatException("Exception");
}
}
这应该适用于您的示例。解决方案:
我发现我需要处理错误的请求。
所以,我有超控
@Override
protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
//Handle Bad Request
}
@覆盖
受保护的ResponseEntity HandleHttpMessageGenoTreadable(HttpMessageGenoTreadableException ex、HttpHeaders标头、HttpStatus状态、WebRequest请求){
//处理错误请求
}
解决方案:
我发现我需要处理错误的请求。
所以,我有超控
@Override
protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
//Handle Bad Request
}
@覆盖
受保护的ResponseEntity HandleHttpMessageGenoTreadable(HttpMessageGenoTreadableException ex、HttpHeaders标头、HttpStatus状态、WebRequest请求){
//处理错误请求
}
如果用户传递整数的溢出值,即大于整数的最大值,则它也会失败。我想拥有这样的功能,如果任何用户/黑客将通过溢出值,我不想显示堆栈跟踪,说NumberFormatException。如果用户通过整数的溢出值,即大于整数的最大值,那么它也会失败。我希望有这样的功能,如果任何用户/黑客将通过溢出值,我不想透露堆栈跟踪,说NumberFormatException。我知道这个解决方法,但我恐怕我想在POST请求中使用它。作为POJO中的一个字段,根据我的业务需求,应该包含Integer/long/biginger。如果我传递溢出值,即,超过最大允许值,它也充当格式错误的REST api uri,确定然后继续使用几个异常处理程序,我提到的问题是级别,顶层发现未传递整型as对象,然后首先抛出它,您可以捕获它,如何捕获?只需检查异常并创建一个异常处理程序方法或添加数字的当前异常处理程序,然后注册或添加显示的XXXXXXXXException。String objectYes如果方法出现异常,则可以正常工作。假设您通过了,即,http://localhost:8085/mypojoInteger/12321342343243243443
,它是一个数字,但仍然表现为格式错误的uri,因为它超过了整数的限制,并给出了400个错误请求。这是另一个例外,对吗?然后,您应该为该异常创建一个新的自定义异常处理程序。我知道这个解决方法,但恐怕我想在POST请求中使用它。作为POJO中的一个字段,根据我的业务需求,应该包含Integer/long/biginger。如果我传递溢出值,即,超过最大允许值,它也充当格式错误的REST api uri,确定然后继续使用几个异常处理程序,我提到的问题是级别,顶层发现未传递整型as对象,然后首先抛出它,您可以捕获它,如何捕获?只需检查异常并创建一个异常处理程序方法或添加数字的当前异常处理程序,然后注册或添加显示的XXXXXXXXException。String objectYes如果方法出现异常,则可以正常工作。假设您通过了,即,http://localhost:8085/mypojoInteger/12321342343243243443
,它是一个数字,但仍然表现为格式错误的uri,因为它超过了整数的限制,并给出了400个错误请求。这是另一个例外,对吗?然后,您应该为该异常创建一个新的自定义异常处理程序。
@GetMapping("/mypojoInteger/{sentNumber}")
public void getData(@PathVariable("sentNumber") Object sentNumber) {
if (!(data instanceof Integer)) {
throw new NumberFormatException("Exception");
}
}
@Override
protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
//Handle Bad Request
}