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

Spring ControllerAdvice全局异常处理程序未返回响应

壤驷华辉
2023-03-14

我有一个Groovy Spring Boot微服务,它返回一个帖子列表。请求进入控制器,控制器调用服务类中的方法,如果没有找到POST,则抛出自定义错误消息。

我已经创建了一个带有@ControllerAdvice注释的控制器,我想截获错误,并创建了一个特定于自定义错误的处理程序。它应该返回一个POJO。目前正在调用ControllerAdvice处理程序,但来自microservice的响应是500错误

控制器

@RequestMapping(value ='getCommentList', method = RequestMethod.POST)
def getCommentList(@RequestBody requestParams) {
    def response
    String userId = requestParams.userId
    String uuid = requestParams.uuid
    response = commentService.findCommentsByUserIdAndUuid(userId, uuid)
}

服务方式

def findCommentsByUserIdAndUuid(String userId, String uuid) {
    User user = userRepository.findByUserId(userId)
    Long userId = tenant?.id
    List responses = commentRepository.findCommentsByUserAndUuidNotDeleted(userId, uuid)
    if (responses.size() == 0) {
        throw new CommentsNotFoundException()
    } else {
        def data = JsonOutput.toJson(retMap)
        return data
    }
}

自定义异常类包com。消息例外

class CommentsNotFoundException extends Exception {
    String errorMessage
    def dataReturned

    public commentsNotFoundException() {
       NewsFeedMessage.buildRequestErrorMessageWithData(errorMessage, dataReturned)
    }
}

将要返回的POGO

package com.news.utils

import org.springframework.http.HttpStatus

class NewsFeedMessage {
    int httpStatus
    String type
    String message
    def dataReturned
    def subMessages = []

    static NewsFeedMessage buildRequestErrorMessageWithData(mainMessage, data) {
        return new NewsFeedMessage(
            httpStatus: 400,
            message: mainMessage,
            dataReturned: data
        )
    }
}

和全局异常处理程序with@ControllerAdvice注释

package com.news.exception

import com.newa.utils.NewsFeedMessage
import org.springframework.boot.configurationprocessor.json.JSON
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.ControllerAdvice
import org.springframework.web.bind.annotation.ExceptionHandler
import org.springframework.web.context.request.WebRequest
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(CommentsNotFoundException.class)
    public NewsFeedMessage handleException() {
        def response = NewsFeedMessage.buildRequestErrorMessageWithData("testing 1234", [])
        //return response as JSON
    }
}

调试时,代码会尽可能地

        def response = NewsFeedMessage.buildRequestErrorMessageWithData("testing 1234", [])

然而,没有任何回报。使用邮递员返回的邮件为:

{
    "timestamp": "2020-10-23T16:27:35.572+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "No message available",
    "path": "/comment/getCommentList"
}

这里有什么明显的错误吗?

共有1个答案

麹耘豪
2023-03-14

我认为NewsFeedMessage不支持返回类型。检查ExceptionHandler文档,发现有一个关于支持的返回类型的块。尝试返回响应属性

 类似资料:
  • 问题内容: 有没有一种方法可以在Java中创建全局异常处理程序。我想这样使用: 处理程序可能无法捕获在主体中引发的异常。 马丁 问题答案: 使用Thread.setDefaultUncaughtExceptionHandler。有关示例,请参见Rod Hilton的“ Global Exception Handling ”博客文章。

  • 问题内容: 我有一个应用程序,需要编写一个自定义的全局未捕获的异常处理程序。我已经阅读了所有stackoverflow线程,并且其中每个线程都只是缺少一个清晰而简单的示例,说明了如何实现这一点。 考虑以下简单示例: 它抛出一个标准异常,它只是一个标准输出。我如何实现自己的异常,该异常可以通过将错误输出到日志文件中的简单方法覆盖标准异常?显然,实际的应用程序要大得多,我们正在谈论未捕获的异常,这就是

  • 统一错误处理 文档:https://eggjs.org/zh-cn/tutorials/restful.html 自定义一个异常基类 // app / exceptions / http_exceptions.js class HttpExceptions extends Error { constructor(msg='服务器异常', code=1, httpCode=400) {

  • Middleware: 全局异常处理 我们在岩浆的实例其实已经注意到了,compose 的连接方式,让我们有能力精确控制异常。 Koa中间件最终行为强依赖注册顺序,比如我们这里要引入的异常处理,必须在业务逻辑中间件前注册,才能捕获后续中间件中未捕获异常,回想一下我们的调度器实现的异常传递流程。 <?php class ExceptionHandler implements Middleware

  • 因此,我试图以通用的方式记录spring项目的控制器返回的所有未捕获的异常。我可以使用以下异常处理程序来完成此操作: 但是,对于方法的每次调用,由于方法中抛出的异常,会创建第二个错误日志:代码来自org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolveHandlerMethodExc

  • 我有一个带post请求的控制器。我试图用一个简单的NotNull注释验证POJO。我正在使用ControllerAdvice来处理异常。 所以我尝试使用它,但当我启动应用程序时,我得到了以下信息: 因此,我想为BindException创建自己的处理程序,但当我为BindException类创建ExceptionHandler时,spring应用程序不会启动。如果我注释掉handleBindExc