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

如何解决Spring ControllerAdvice全局异常处理程序不返回响应

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

我创建了一个用@ControllerAdvice注释的控制器,该控制器要拦截错误,以及一个针对自定义错误的处理程序。它应该返回一个POJO。目前正在调用ControllerAdvice处理程序,但微服务的响应是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.news.exception

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
        )
    }
}

还有带有@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"
}

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

解决方法

我认为 NewsFeedMessage 不是支持的返回类型。检查 ExceptionHandler docs 并且有一个关于支持的返回类型的块。尝试返回 ResponseEntity<>(new NewsFeedMessage())

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?