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

JavaSpring Boot:抛出一个异常,将特定的HTTP代码返回给客户端

阳光辉
2023-03-14

我正在使用Java和Spring Boot开发一个Web应用程序。具体来说,我正在审查其他开发人员编写的一些代码。我使用Postman对我的应用程序进行HTTP调用。有些情况下,我的应用程序需要通知调用方某些情况。在这个例子中,应用程序的开发人员向调用者抛出了一个JwtTokenExc0019,以防出现IOExc0019

try {
    myToken = methodThatObtainsAToken(tokenInput);
}catch(IOException ex) {
    throw new JwtTokenException("Error 401", JwtStatusResponse.JWT_NOT_VALID); // TODO: cambiare
}

在这段代码中,我有很多其他非常类似的情况,我必须做以下事情:我必须替换代码抛出新的JwtTokenException,以便它抛出异常,使调用方理解(以便我可以通过Postman看到它们)发生了HTTP错误(使用一些代码)。在我编写的示例中,我只将“Error 401”作为字符串编写。代码中还有其他地方我使用了“Error 500”、“Error 302”等等。。但这些只是信息字符串,与抛出给客户机的真正错误不对应。如何抛出引发“HTTP错误”的正确异常?

共有3个答案

益稳
2023-03-14

从您的附件截图。您的应用程序返回401未授权。我认为您不再需要传递错误代码,因为您从响应本身获得它。异常不会返回Http状态代码,作为开发人员,您有责任告诉您的应用程序返回哪个错误代码。例如在你的RestController中

@GetMapping(path = "{id}")
public ResponseEntity<ResponseModel> getEmployee(@PathVariable("id") String id) {
    ResponseModel result = employeeService.findById(id);
    return new ResponseEntity<>(result, HttpStatus.OK); // <--- THIS
}

在自定义异常处理程序中,可以这样做。

注意:当您从Jwt验证过滤器调用时,会触发此操作

@ExceptionHandler(value = ExpiredJwtException.class)
public ResponseEntity<Object> handleExpiredJwt(ExpiredJwtException e) {
    ApiException apiException = new ApiException(e.getLocalizedMessage(), HttpStatus.UNAUTHORIZED);
    return new ResponseEntity<>(apiException, UNAUTHORIZED);
}
王叶五
2023-03-14

如果大多数异常的处理方式与您发布的代码类似,并且您不想更改方法的返回类型,只需将它们替换为

catch(Exception e){   
    throw new ResponseStatusException(HttpStatus.NOT_FOUND);
}

这将给出以下输出

{
    "timestamp": "2021-03-10T09:25:04.823+0000",
    "status": 404,
    "error": "Not Found",
    "message": "Not Found",
    "path": "/account"
}

如果你想获得例外信息,只需添加

catch(Exception e){   
    throw new ResponseStatusException(HttpStatus.NOT_FOUND,null, e);
}

答复:

{
    ...
    "message": "404 NOT_FOUND; nested exception is java.lang.ArithmeticException",
    ...
}

请注意,如果您没有声明自己的异常解析程序,它将被记录

 2021-03-10 15:28:20.043  WARN 11392 --- [nio-8090-exec-2] .w.s.m.a.ResponseStatusExceptionResolver : Resolved [org.springframework.web.server.ResponseStatusException: 404 NOT_FOUND "Not Found"; nested exception is java.lang.ArithmeticException]

您可以传递一个描述异常的字符串,而不是null,它将替换json响应中的“message”。

皇甫树
2023-03-14

通常返回带有主体对象和状态集的响应实体,以提供有趣的信息:

        return ResponseEntity.ok()
        .headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, trackDTO.getId().toString()))
        .body(result);

响应实体是组织。springframework。http。ResponseEntotuy提供了许多方便的方法来设置所有的头文件和任何必要的内容。

 类似资料:
  • 我使用spring-boot(v2 M3)和Spring-WebFlux进行一个项目。在编写一个特性时,我看到我的微服务返回一个HTTP200状态代码,同时在流量中返回一个错误。 使用一个简单的异常处理程序: 我在集成测试中用webTestClient测试结果: 结果,我的测试失败了,因为返回错误通量的控制器返回的是200状态码,而不是503状态码(异常日志“test”在我的控制台中被很好地跟踪)

  • 我正在尝试测试当试图除以零时,是否会抛出带有定制消息的异常。 方法是这样的: 在搜索了一些解决方案后,我发现这是一种做这件事的方法,但是我的IDE不能识别“expected”... 我只是不知道为什么我的 IDE 无法识别“预期”。不知道这是否与 Junit 版本有关,或者我使用的语法是否存在问题。 在我迄今为止使用的所有其他测试中,我从未在@Test之后添加任何内容。我刚刚在另一个线程中找到了类

  • 我尝试调用getCodeResponse()时遇到IOException。当参数有效时,没有异常,代码响应为200。如果参数错误,服务器应返回401代码。我已经测试了Hull的查询。如果参数错误,我会得到401代码。当出现错误代码时,HttpURLConnection类可能会引发异常。

  • 我正在使用具有以下配置的Redisson连接到哨兵服务器:

  • 我需要多次调用服务(>50次)并聚合响应。因此,我决定使用,使用Async和CustomExecuter(它自己的线程池)来提高速度,而不是等待服务响应。 我在类路径上使用带有ApacheHTTP和Hystrix的feign客户机。我可以看到它有时是工作的,有时我得到例外,因为电路是开放的。

  • 我见过这样的例子 但我也认为这是一种选择 抛出异常或简单返回NotFound (IHttpActionResult实例)有什么好处吗? 我知道响应/请求管道中的某些阶段可以处理这些结果中的任何一个,就像第一个示例一样