gpt4 book ai didi

java - 永远不会调用 RestController 中 MethodArgumentNotValidException 的 Spring Boot ExceptionHandler

转载 作者:行者123 更新时间:2023-12-02 16:17:03 26 4
gpt4 key购买 nike

我使用的是 Spring Boot v2.2.10 和 Spring v5.2.9。我创建了一个带有 @Valid @RequestBody 注释的 Rest Controller 。验证工作正常(当提交超出约束的值时,我收到 400 BAD REQUEST 响应),但我不喜欢默认错误消息,因为它揭示了太多的内部结构。因此,我定义了一个 @ExceptionHandler(MethodArgumentNotValidException.class) 方法,但此方法从未被调用。

这是带有异常处理程序的 Controller :

import java.util.List;
import java.util.stream.Collectors;

import javax.validation.Valid;

import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import lombok.RequiredArgsConstructor;


@RestController
@RequiredArgsConstructor
@RequestMapping("/api/data")
public class DataController {

@PostMapping(path = "/{id}", consumes = MediaType.APPLICATION_JSON_VALUE)
private void postData(
@PathVariable String id,
@Valid @RequestBody MyDTO dto) {

// DO SOMETHING

}

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public List<String> handleValidationExceptions(MethodArgumentNotValidException ex) {
System.out.println("Handling method argument not valid exception");
return ex.getBindingResult()
.getAllErrors().stream()
.map(ObjectError::getDefaultMessage)
.collect(Collectors.toList());
}
}

DTO:

import javax.validation.constraints.Max;
import lombok.Getter;

@Getter
public class MyDTO {

@Max(value = 1, message = "Value should not be greater than 1")
private float value;

}

我还尝试将 ExceptionHandler 放入一个额外的类中:

// Imports

@Order(Ordered.HIGHEST_PRECEDENCE)
@RestControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(MethodArgumentNotValidException.class)
// Same as before

}

正如我所说,我的 ExceptionHandler 永远不会被调用。我可能做错了什么?

最佳答案

尝试从类 ResponseEntityExceptionHandler 扩展并覆盖 handleMethodArgumentNotValid

@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
@Slf4j
public class ExceptionController extends ResponseEntityExceptionHandler {

@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
HttpHeaders headers, HttpStatus status, WebRequest request) {
return ...;
}

关于java - 永远不会调用 RestController 中 MethodArgumentNotValidException 的 Spring Boot ExceptionHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66371164/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com