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

Springboot没有将错误抛给客户端

梁兴修
2023-03-14

我希望当遇到错误时,用户会收到对其http调用的异常响应。该错误确实被捕获并显示在spring日志中,但不会返回给用户。为什么?

我的方法是:

  @Override
  protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
      FilterChain chain) {
    try {
      // Check for authorization header existence.
      String header = request.getHeader(JwtConstant.AUTHORIZATION_HEADER_STRING);
      if (header == null || !header.startsWith(JwtConstant.TOKEN_BEARER_PREFIX)) {
        chain.doFilter(request, response);
        return;
      }
      // Validate request..
      UsernamePasswordAuthenticationToken authorization = authorizeRequest(request);
      SecurityContextHolder.getContext().setAuthentication(authorization);
      chain.doFilter(request, response);
    } catch (Exception e) {
      SecurityContextHolder.clearContext();
      throw new InternalServerErrorException("Erreur sur le filtre interne -> " + e.toString());  // Should return this to the user
    }
  }

日志中的错误:

.common.application.exception.InternalServerErrorException: Erreur sur le filtre interne -> 
.common.application.exception.InternalServerErrorException: Erreur lors du authorizeRequest

错误处理程序:

@ControllerAdvice
public class ApiResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
    String typeDateFormat = "yyyy-MM-dd HH:mm:ss";
...

    @ExceptionHandler(InternalServerErrorException.class)
    public final ResponseEntity<ExceptionResponse> handleInternalServerErrorException(InternalServerErrorException ex,
            WebRequest request) {

        ExceptionResponse exceptionResponse = new ExceptionResponse(
                new SimpleDateFormat(typeDateFormat).format(new Date()), ex.getMessage(),
                request.getDescription(false), "500");
        return new ResponseEntity<>(exceptionResponse, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

xception.java

@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public class InternalServerErrorException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    public InternalServerErrorException(String exception) {
        super(exception);
    }

}

例外回复。JAVA

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ExceptionResponse {
    
  private String date;
  private String message;
  private String uri;
  private String status;
  
}

用户收到403。。我不知道为什么,但我应该接受我的错误,没有任何身体。。

InternalServerExc0019在try/catch之外工作。.

共有1个答案

赫连宏伯
2023-03-14

基本上,只有从@Controller/@RestContoller方法引发异常时,@ControllerAdvice才会起作用。

从技术上讲,spring mvc框架(即@ControllerAdvice)只有在HTTP请求能够成功通过SecurityFilterChain(由spring security配置)中的所有Filter并由DispatcherServlet处理时,才会对其生效。但是现在,在请求到达DispatcherServlet之前,您的异常似乎是从安全过滤器链中的一个过滤器中抛出的,因此将不会调用@ControllerAdvice来处理此异常。

您必须咨询Spring Security过滤器中是否有允许您自定义异常的相关配置。如果没有,您仍然可以在该过滤器中手动执行,因为您可以从那里访问HttpServletResponse

 类似资料:
  • 问题内容: 我正在尝试创建一个简单的脚本,以便每次文件更新时都将文件中的数据发送到客户端。我已经测试过,发现该文件已被读取,但是客户端什么也没收到。控制台中没有错误。我对socket.io相当陌生。 node.js代码 客户代码 问题答案: 每当事情无法正常进行时,您都需要诉诸“调试模式”。在这种模式下,您需要收集所有可能发生的事件,并从中学到什么。为此,请将以下代码添加到客户端: 这些消息都记录

  • 问题内容: 我只是通过nodejs.org上的软件包安装了node和npm,并且每当我尝试使用npm搜索或安装某些东西时,都会抛出以下错误,除非我对命令进行了sudo。我觉得这是权限问题?我已经是管理员。 问题答案: 这看起来像您的主目录中的权限问题。要回收 .npm 目录的所有权, 请 执行:

  • 问题内容: 尝试使用pip-3.2安装suds,但由于错误而失败 此命名的客户端是哪个模块,如果需要的话该如何安装? 问题答案: 根据此页面,您应该尝试运行。看起来可能尚未更新为与3.2一起使用,而实际上已经更新了。希望这可以帮助! 编辑: 在PyPI页面上: 轻量级的SOAP客户端(Jurko的分支)。 基于Jeff Ortel(redhat dot com上的jortel)的原始“ suds”

  • null 然后如何用AngularJS将其呈现给客户机?

  • 问题内容: 我正在使用WebApi为后端构建AngularJS SPA应用程序。我在服务器上使用属性进行模型验证,如果验证失败,这就是我从ModelState返回的内容。 然后如何使用AngularJS将其呈现给客户端? 问题答案: 呼叫服务器时,请根据对诺言的拒绝捕获错误。 然后在您的控制器中,我建议在处理显示的错误时将对错误数组的响应展平,如下面的小提琴示例所示: 放在一起:

  • 我们试图对cadence设置进行基准测试(目前在2个EC2实例上运行:m5a.xlarge ),发现了许多cadence客户端错误: cadence_service:cadence_matching,操作:历史记录重新记录活动任务已启动