我的控制器有以下方法:
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": false,
"noImplicitAny": false,
"suppressImplicitAnyIndexErrors": true,
"baseUrl": "./app",
"outDir": "./dist"
}
}
由于资源参数之前的@Valid,我希望当我将@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public void save(@RequestBody @Valid final User resource) {
createInternal(resource);
}
传递到我的实体的@Column上的NULL
时,它会被以下异常处理程序拦截,< / p>
nullable=false
但似乎我只能这样处理它:
@Override
protected final ResponseEntity<Object> handleMethodArgumentNotValid(final MethodArgumentNotValidException e,
final HttpHeaders headers,
final HttpStatus status,
final WebRequest request) {
log.info("Bad Request: {}", ex.getMessage());
log.debug("Bad Request: ", ex);
...
return handleExceptionInternal(e, dto, headers, HttpStatus.BAD_REQUEST, request);
}
为什么@ExceptionHandler(value = { ConstraintViolationException.class,
DataIntegrityViolationException.class })
public final ResponseEntity<Object> handleBadRequest(final RuntimeException e,
final WebRequest request) {
...
return handleExceptionInternal(ex, apiError, new HttpHeaders(), HttpStatus.BAD_REQUEST, request);
}
异常处理程序不应该像它应该那样选择它?
答案 0 :(得分:1)
在你的&#39; handleMethodArgumentNotValid&#39;之前有机会触发,DefaultHandlerExceptionResolver处理这个
或者如果你想处理声明,@ExceptionHandler(MethodArgumentNotValidException.class)
@RequestBody方法参数可以使用@Valid,in进行注释 在哪种情况下,它将使用配置的Validator进行验证 实例。使用MVC命名空间或MVC Java配置时,a 假设JSR-303,JSR-303验证器自动配置 实现在类路径上可用。
就像使用@ModelAttribute参数一样,可以使用Errors参数 用来检查错误。如果没有宣布这样的论证,a 将引发MethodArgumentNotValidException。例外是 在DefaultHandlerExceptionResolver中处理,它发送400 错误回到客户端。在你的'handleMethodArgumentNotValid&#39;之前 有机会开火,这是handndf
答案 1 :(得分:0)
为什么没有handleMethodArgumentNotValid异常处理程序选择 它应该像它应该的那样?
Spring容器(启动期间)扫描所有使用@RequestMapping
和@ExceptionHandler
注释的控制器方法。
稍后,当请求附带url
时,将使用handlermapping
标识控制器方法,然后注入所有必需的依赖项(控制器方法参数),如Model
,{{ 1}}等等。并委托调用控制器方法来为输入请求提供服务。
由于HttpRequest
未使用handleMethodArgumentNotValid
或@RequestMapping
进行注释,因此Spring容器无法识别此方法。
答案 2 :(得分:-1)
@ExceptionHandler({ ConstraintViolationException.class })
public ResponseEntity<> handleConstraintViolation(ConstraintViolationException ex,
WebRequest request) {
// error handeling
return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);
}
更多详情,请访问https://www.baeldung.com/global-error-handler-in-a-spring-rest-api