[英]JAX-RS (jersey implementation) ExceptionMapper<Throwable> aren't catching ConstraintViolationException
我有一個ExceptionMapper
作為處理我所有ExceptionMapper
的Provider
。
所以很明顯,我的類實現了ExceptionMapper<Throwable>
並且我們知道,所有異常都以某種方式擴展了Throwable
。
現在我使用 jax-rs @NotNull
來檢查我的資源輸入值是否為空,並且通過一些搜索,我意識到當注釋字段為空時它會拋出ConstraintViolationException
。
所以我嘗試處理它並在我的 ExceptionMapper 中添加一些細節來響應(添加一些自定義 json 模型),如下所示:
@Provider
public class AllExceptionMapper implements ExceptionMapper<Throwable> {
private final Logger logger = LogManager.getLogger(AllExceptionMapper.class);
@Override
public Response toResponse(Throwable ex) {
Response response;
CustomError error;
// handle some errors
else if (ex instanceof ConstraintViolationException) {
error = new CustomError(
324, // predefined error type in our documents
"some details"
);
response = Response.status(Response.Status.BAD_REQUEST).entity(error).build();
}
// handle some other errors
return response;
}
}
問題是這不起作用,但是如果我創建另一個實現ExceptionMapper<ConstraintViolationException>
異常映射器提供程序並在那里處理它,它可以正常工作。
正如我之前所說(並檢查過)所有異常都是從Throwable
類擴展而來的,所以我錯過了什么,為什么它不起作用?
......
通過不起作用,我的意思是它忽略了我的映射器(從ExceptionMapper<Throwable>
實現的映射器)並具有正常行為,即返回狀態代碼 400 沒有響應負載,就像根本沒有映射器一樣
ExceptionMapper
應該工作的方式是,您可以創建一個通用的ExceptionMapper<Throwable>
來處理所有錯誤。 然后您可以創建更具體的ExceptionMapper
,以另一種方式處理更具體的錯誤。 所有這些都在單獨的課程中。
在單獨的類中執行它的事實對您有用,讓我相信某處有一個更具體的ExceptionMapper
,它可以在您之前處理異常。
ExceptionMappers 的使用方式實際上非常干凈,並且還可以保持您的代碼干凈。 想要將代碼保存在一個中心位置, if
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.