Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RestController中MethodArgumentNotValidException的Spring引导异常处理程序从未被调用_Java_Spring_Spring Boot_Rest_Exception - Fatal编程技术网

Java RestController中MethodArgumentNotValidException的Spring引导异常处理程序从未被调用

Java RestController中MethodArgumentNotValidException的Spring引导异常处理程序从未被调用,java,spring,spring-boot,rest,exception,Java,Spring,Spring Boot,Rest,Exception,我使用的是SpringBootV2.2.10和SpringV5.2.9。我已经用@Valid@RequestBody注释创建了一个Rest控制器。验证工作正常(当提交超出约束的值时,我会收到一个400错误请求响应),但我不喜欢默认的错误消息,因为它显示了太多的内部信息。因此,我定义了一个@ExceptionHandler(MethodArgumentNotValidException.class)方法,但这个方法从未被调用 这是具有异常处理程序的控制器: import java.util.Lis

我使用的是SpringBootV2.2.10和SpringV5.2.9。我已经用
@Valid@RequestBody
注释创建了一个Rest控制器。验证工作正常(当提交超出约束的值时,我会收到一个
400错误请求
响应),但我不喜欢默认的错误消息,因为它显示了太多的内部信息。因此,我定义了一个
@ExceptionHandler(MethodArgumentNotValidException.class)
方法,但这个方法从未被调用

这是具有异常处理程序的控制器:

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());
    } 
}
我还尝试将
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 ...;
}
@顺序(有序。最高优先级)
@控制器建议
@Slf4j
公共类ExceptionController扩展ResponseEntityExceptionHandler{
@凌驾
受保护响应handleMethodArgumentNotValid无效(MethodArgumentNotValidException ex,
HttpHeaders标头、HttpStatus状态、WebRequest请求){
返回。。。;
}

你的意思是来自Spring MVC的
ResponseEntityExceptionHandler
吗?我的项目中没有使用Spring MVC。@AnjaM Spring Boot under the hood使用Spring MVC或Spring WebFlux来处理与web相关的事情。在你的代码示例中,看起来你在使用SpringMVC@MaciejWalkowiak对不起,我是个新手,所以我不太知道它是怎么回事我们在项目中使用了很多WebFlux(虽然不是在这个特定的控制器中)当我插入
导入org.springframework.web.servlet.MVC.method.annotation.ResponseEntityExceptionHandler
时,Eclipse告诉我它无法解析
org.springframework.web.servlet
。如果我将Spring MVC添加到
pom.xml
并尝试启动项目,我会得到一个
javax.servlet.ServletException的ClassNotFoundException
@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 ...;
}