当前位置: 首页 > 知识库问答 >
问题:

如何处理方法ArgumentNotValid异常

邵阳辉
2023-03-14

我想处理验证器引发的异常。

我用ControllerAdvice注释创建了异常处理程序。它处理其他异常,但不处理MethodArgumentNotValidException。

异常处理程序

@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(value
        = {ResourceNotFoundException.class, EntityNotFoundException.class})
    protected ResponseEntity<Object> handleNotFound(
        RuntimeException ex, WebRequest request) {

    APIException apiException = new APIException(HttpStatus.NOT_FOUND,
            ex.getMessage(), request);

    return handleExceptionInternal(ex, apiException,
            new HttpHeaders(), apiException.getStatus(), request);
    }

    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid
            (MethodArgumentNotValidException ex,
                 HttpHeaders headers, HttpStatus status, WebRequest request)     {
        APIException apiException = new APIException(HttpStatus.BAD_REQUEST,
            ex.getMessage(), request);

        return handleExceptionInternal(ex, apiException,
            new HttpHeaders(), apiException.getStatus(), request);
    }
}

已验证的类(没有getter/setter等)

public class ClassQuery {
    @Min(1)
    private Integer minYear;
    @Min(1)
    private Integer year;
    @Min(1)
    private Integer maxYear;
    private String name;
    private String profile;
}

Rest api控制器

@GetMapping
public Page<Class> getClasses(@Valid ClassQuery classQuery, Pageable pageable) {
    return classService.getClasses(classQuery, pageable);
}

Api异常(没有getter/setter等)

public class APIException {
    private Date timestamp;
    private HttpStatus status;
    private String message;
    private String path;

    public APIExceptionMessage(HttpStatus status, String message, WebRequest request) {
            this();
            this.status = status;
            this.message = message;
            this.path = getRequestURI(request);
    }
}

目前,我从验证器获得了一个空响应,带有错误的\u请求http状态,而其他异常得到了正确处理。我也尝试过不扩展ResponseEntityExceptionHandler并用@ExceptionHandler处理它,但它忽略了我的响应正文,作为响应,它给出了默认的错误消息。我没有任何错误。

共有1个答案

赵嘉纳
2023-03-14

这可能有点太晚了。

我遇到了同样的问题,其中ethodArgumentNotValidExctive不被注释为ControlllerAdvie的类处理。在我的例子中,我想序列化并将自定义的ErrorDTO对象作为JSON发送到HTTP客户端。

解决方案:ME odArgumentNotValidExctive应从org.springframework.web.bind.中导入。

 类似资料:
  • 问题内容: 我们正在进行有关如何处理REST异常的持续讨论。 响应内容类型:JSON 我们有两种解决方案: 将所有未检查的异常作为JSON响应抛出。 发送请求无效响应代码。 参数: 当出现错误时,为什么要返回JSON?只需发送无效的响应码即可。 相反的观点: 对于普通开发人员而言,响应代码的技术性太强。 你怎么说? 问题答案: 对于JSON API,我最近开发了两者。我总是使用有效的JSON进行响

  • 问题内容: 这个问题已经在这里有了答案 : 我的PDO声明无效 (1个答案) 4年前关闭。 我正在尝试在php上使用类,但是在查找正确的错误处理方式时遇到了一些麻烦,我编写了以下代码: 这部分代码不报告错误,但根本不起作用,底部的var 返回空值。 有人可以帮我找到我错了吗? 问题答案: 除非您告知,否则PDO不会引发异常。你跑了吗: 在PDO对象上?

  • 假设我有一个类和一个方法 现在,我想为由流传递的的每个实例调用foo,如下所示: 问题:如何正确处理异常?代码在我的机器上没有编译,因为我没有处理foo()可能引发的异常。的在这里似乎没有用。这是为什么?

  • 问题内容: 我正在尝试在某些特定异常发生时添加一些监视。例如,如果我有这样的一个方面: 和测试类: 作为输出,我将得到: 我想知道是否有办法在引发异常后立即拦截方法执行,在建议中做点什么,然后继续在相应的catch块中执行代码?这样,如果我打电话给我,我会得到: 问题答案: 是的你可以。您需要切入点: 假设类在包中,则日志输出: 更新: 如果您想知道异常处理程序的位置,有一个简单的方法:使用封闭的

  • 我正在尝试在发生特定异常时添加一些监视。例如,如果我有这样一个方面: 和测试等级: 作为输出,我将得到: 我想知道是否有办法在抛出异常之后拦截方法执行,在我的建议中做些什么,然后继续在相应的catch块中执行代码?因此,如果我调用我可以得到:

  • 我在我的项目中使用Log4j 2将儿子日志写入数据库表。这些事件是基于某些MDC密钥/值对来标识的。我关心的是这个appender可以从其append方法中抛出的未经检查的LoggingExcture。这些数据库日志是在异步事务进程中生成的,我不希望主进程受到appender引发的潜在异常的影响。我应该怎么照顾它?我应该将基于配置的appender移动到自定义appender吗?在日志事件追加错误