簡體   English   中英

使用JOOQ,如何將SQLException映射到業務異常?

[英]Using JOOQ, how do you map an SQLException to a business exception?

我正在使用JOOQ,並希望將某些SQLExceptions映射到業務異常。 異常處理文檔頁面說:

以下關於執行偵聽器文檔的部分意味着覆蓋jOOQ的異常處理,如果您希望單獨處理某些類型的約束違規,或者您從數據庫中引發業務錯誤等。

但是, 關於執行偵聽器的頁面上沒有實際的例子。

我知道我必須實現ExecuteListener的方法exception(ExecuteContext) ,但是我不清楚是否應該從那里throw另一個異常,或者使用ExecuteContext.exception方法來覆蓋現有的異常。 例如。

@Override
public void exception(ExecuteContext ctx) {
    if (ctx.sqlException().getSQLState().equals("23503")) {
        throw new ForeignKeyViolationException("Foreign key violation", ctx.sqlException());
    }
}

要么:

@Override
public void exception(ExecuteContext ctx) {
    if (ctx.sqlException().getSQLState().equals("23503")) {
        ctx.exception(ForeignKeyViolationException("Foreign key violation", ctx.sqlException()));
    }
}

我擔心,你必須自己做這項工作。 這就是為什么......

使用ExecuteListener不適合您

如果您想要jOOQ的DataAccessException替代異常,那么為SQLException自動和全局轉換選擇ExecuteListener的路徑很有用 - 例如Spring的DataAccessException用於進一步處理( 這里是示例轉換器 )。 它不適合自動將約束違規異常重新連接到特定的“業務異常”,因為ExecuteListener (作為全局actor)不知道可能在什么情況下發生約束違規。 可能有:

  • 導致約束違規的錯誤(例如,您應該更新,而不是插入)
  • 導致約束違規的用戶錯誤(例如,用戶提交了兩次表單)
  • 導致約束違規的實際業務規則(例如檢查約束)

我擔心,你必須單獨為每個查詢做出決定。 ExecuteListener僅幫助您重新連接異常處理的技術部分。

為什么手冊中提到“業務錯誤”?

你引用了手冊:

或者如果您從數據庫中引發業務錯誤

這些業務錯誤可能是您從數據庫觸發器引發的用戶定義的錯誤,例如,如果您不會受到約束沖突,但直接來自數據庫會產生有意義的業務錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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