java with spring boot:抛出一个异常,将特定的http代码返回给客户机

qncylg1j  于 2021-07-23  发布在  Java
关注(0)|答案(3)|浏览(473)

我正在使用java和springboot开发一个web应用程序。具体来说,我正在审查其他开发人员编写的一些代码。我使用postman对我的应用程序进行http调用。在某些情况下,我的应用程序需要通知调用者某些情况。在本例中,应用程序的开发人员抛出 JwtTokenException 打电话的人 IOException .

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

当 Postman 出了问题时:

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

ilmyapht

ilmyapht1#

通常返回设置了body对象和状态的响应实体,以提供有趣的信息:

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

响应实体是org.springframework.http.responseentotuy,它提供了许多方便的方法来设置所有的头和任何必要的东西。

jaxagkaj

jaxagkaj2#

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

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”。

kq4fsx7k

kq4fsx7k3#

从你的附加屏幕截图。您的应用程序未经授权返回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);
}

相关问题