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

Rest-如何在没有堆栈跟踪的情况下发送Http错误响应

松国兴
2023-03-14

我有一个rest web服务。如果抛出任何异常,web服务将返回http 500错误。但我不想发送这个带有异常堆栈跟踪的错误响应。我只想发送错误代码和错误消息。我没有做到这一点。我怎么能这么做?

我已经尝试过@ControllerAdvice和@ExceptionHandler注释,但我做不到。当我使用@ResponseStatus注释时,总是发送静态“reason”值。如何设置此值?谢谢你的帮助。

public class SendMessageController{
    private Logger log = LogManager.getLogger(getClass());
    @Autowired
    private QueueService queueService;

    @RequestMapping(value="/message/check", method = RequestMethod.POST, headers={ "content-type=application/json"})
    public @ResponseBody
    ApiResponse sendMessage(@RequestBody String requestMessage) throws Exception {
        try {
            return new ApiResponse(queueService.processRequestForJSONString(requestMessage);
        } catch (Exception e) {
            throw new GenericException(HttpStatus.INTERNAL_SERVER_ERROR, e.getMessage());
            //throw e;
        }
    }

    @ResponseStatus(value=HttpStatus.INTERNAL_SERVER_ERROR, reason="Exception Message")
    public class GenericException extends Exception {
        public HttpStatus httpCode;
        public String errorMessage;

        public GenericException(HttpStatus httpCode, String errorMessage){
            this.httpCode = httpCode;
            this.errorMessage = errorMessage;
            //I can't set "reason"
        }
    }
}

共有1个答案

终育
2023-03-14

有很多可能的解决方案,我非常肯定ErrorHandler是一个更好的方法。

@GetMapping(value="/{empId}", produces=MediaType.APPLICATION_JSON_VALUE)    
public ResponseEntity<EmployeeInfoItem> getEmployeeInfo(@PathVariable("empId") Integer empId) {
    try {
        ...
    } catch (Exception e) {
        logger.error( e.getMessage() );
        return ResponseEntity.status(HttpStatus.FAILED_DEPENDENCY).build();
    }
}
 类似资料:
  • 问题内容: 我今天在浏览一些日志时遇到一个奇怪的错误。 它在日志中的显示方式如下: 代码如下所示: 如果重要的话,代码位于jsp中。再次在日志中重复相同的异常(正如您期望的那样)。 我没有任何原因的记录-日志中的上一行显示了查询的执行。在4天的时间内仅发生了两次,似乎并未对系统造成任何损害。 环境:在Java 5的Tomcat下运行的非常繁忙的Web服务。 我并没有要求调试系统的提示-这些错误已久

  • 问题内容: 假设您执行 e.printStackTrace() ,则捕获到一个异常并在标准输出(例如控制台)上获得以下内容: 现在,我想将其发送给log4j之类的记录器,以获取以下信息: 我怎样才能做到这一点? 问题答案: 您将异常直接传递给记录器,例如 取决于log4j来呈现堆栈跟踪。

  • 在我们的日志文件中,我们发现以下内容: 只有这一行,没有异常堆栈跟踪。 出现此异常的try块正在执行使用javassist创建的动态生成的Java字节码。 我想知道两件事: : null 丢失的堆栈跟踪,尽管在块内使用调用日志挂钩,这通常会导致完整的堆栈跟踪被打印在日志文件中。 我的问题: > 什么样的代码会导致日志输出“java.lang.ArrayIndexOutOfBoundsExcepti

  • 问题内容: 这可能是一个非常幼稚的问题。 我曾经相信Java 中的a 总是 包含堆栈跟踪。这是正确的吗? 现在看起来我捕获了 没有 堆栈跟踪的异常。是否有意义?是否 可以 在没有堆栈跟踪的情况下捕获异常? 问题答案: 无需堆栈跟踪就可以捕获Java中的Throwable对象: 构造一个具有指定详细消息,原因,启用或禁用原因,启用或禁用 可写堆栈跟踪 的新throwable 。 填写执行堆栈跟踪。此

  • 现在看来,我在没有堆栈跟踪的情况下捕获异常。有道理吗?是否有可能在没有堆栈跟踪的情况下捕获异常?

  • 问题内容: 程序中没有单个方法“知道”它在堆栈中的位置。它所知道的只是它自己的小工作,它完成了并返回了。因此,当引发异常并打印堆栈跟踪时,它是从哪里来的? 在JVM中监视程序状态的每个应用程序旁边隐式地运行着一个单独的线程吗?还是JVM本身保存此信息,并且在抛出异常时以某种方式从异常中提取数据? 如果是上述两种情况之一,是否可以使用某些调用来检索堆栈跟踪(从监视器线程或JVM) 而不会 引发异常?