问题描述
我有一个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())
。