在控制器方法签名处处理异常
Handling exception at a controller method signature
我有一个 POST
请求,其请求正文包含多个参数。在服务器端,请求主体被映射到一个 POJO。
如果我没有发送任何请求正文,服务器会抛出错误。当我使用注释 @RequestBody(required = false)
时,请求主体被映射到一个 null
对象。我可以验证它并发送适当的响应。
但在这种情况下,当我在请求正文中发送一个空的 json - { }
时,它会映射到一个 not null
对象,其所有属性都设置为 null。没什么意外的。所有属性必须是 non null
,所以我设置了一个属性 - @NotNull
(从 org.springframework.lang.NonNull
导入)。现在,如果我发送一个空 json { }
,我会收到 500 响应,但有如下异常。
2019-08-25 21:49:21.921 ERROR 28538 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class package.model.Model]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `package.model.Model`, problem: someAttribute is marked non-null but is null
at [Source: (PushbackInputStream); line: 3, column: 1]] with root cause
java.lang.NullPointerException: someAttribute is marked non-null but is null
我想捕获异常并发送带有适当响应正文的 200
响应代码。我怎么做?还是有另一种方法来检查非空属性?
基本上我希望请求正文属性必须具有所有属性,否则我希望return 自定义构建错误响应。
做你想做的,你需要使用@ControllerAdvice
。它的工作方式类似于 "watching" 您的应用程序。
@ControllerAdvice
public class CustomizedExceptionHandler {
@ExceptionHandler(NotFoundException.class) // change here for your exception.
public final ResponseEntity<ErrorDetails> handleUserNotFoundException(NotFoundException ex, WebRequest request) {
ErrorDetails errorDetails = ErrorDetails.builder()
.timestamp(new Date())
.message(ex.getMessage())
.details(request.getDescription(false))
.build();
return new ResponseEntity<>(errorDetails, HttpStatus.FORBIDDEN); // you can return whatever you want.
}
}
PS:注意你的异常是NullPointerException
,一个很常见的异常,你的应用程序抛出的每一个空指针都会被你自定义的控制器处理。
我有一个 POST
请求,其请求正文包含多个参数。在服务器端,请求主体被映射到一个 POJO。
如果我没有发送任何请求正文,服务器会抛出错误。当我使用注释 @RequestBody(required = false)
时,请求主体被映射到一个 null
对象。我可以验证它并发送适当的响应。
但在这种情况下,当我在请求正文中发送一个空的 json - { }
时,它会映射到一个 not null
对象,其所有属性都设置为 null。没什么意外的。所有属性必须是 non null
,所以我设置了一个属性 - @NotNull
(从 org.springframework.lang.NonNull
导入)。现在,如果我发送一个空 json { }
,我会收到 500 响应,但有如下异常。
2019-08-25 21:49:21.921 ERROR 28538 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class package.model.Model]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `package.model.Model`, problem: someAttribute is marked non-null but is null
at [Source: (PushbackInputStream); line: 3, column: 1]] with root cause
java.lang.NullPointerException: someAttribute is marked non-null but is null
我想捕获异常并发送带有适当响应正文的 200
响应代码。我怎么做?还是有另一种方法来检查非空属性?
基本上我希望请求正文属性必须具有所有属性,否则我希望return 自定义构建错误响应。
做你想做的,你需要使用@ControllerAdvice
。它的工作方式类似于 "watching" 您的应用程序。
@ControllerAdvice
public class CustomizedExceptionHandler {
@ExceptionHandler(NotFoundException.class) // change here for your exception.
public final ResponseEntity<ErrorDetails> handleUserNotFoundException(NotFoundException ex, WebRequest request) {
ErrorDetails errorDetails = ErrorDetails.builder()
.timestamp(new Date())
.message(ex.getMessage())
.details(request.getDescription(false))
.build();
return new ResponseEntity<>(errorDetails, HttpStatus.FORBIDDEN); // you can return whatever you want.
}
}
PS:注意你的异常是NullPointerException
,一个很常见的异常,你的应用程序抛出的每一个空指针都会被你自定义的控制器处理。