簡體   English   中英

JAX-RS(球衣實現)ExceptionMapper<Throwable> 沒有捕獲 ConstraintViolationException

[英]JAX-RS (jersey implementation) ExceptionMapper<Throwable> aren't catching ConstraintViolationException

我有一個ExceptionMapper作為處理我所有ExceptionMapperProvider

所以很明顯,我的類實現了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM