簡體   English   中英

如何處理spring控制器中的db特定異常

[英]How handle db specific exceptions in spring controller

在我的控制器中,我調用多個數據庫方法。 行需要存儲在oracle和postgres中。 我應該如何處理這種情況下的異常; 重復,唯一約束違例異常等

在代碼中,我處理與oracle和postgres相關的異常。 此代碼全部重復代碼。 如何使用通用代碼處理這種情況。

在這種情況下處理異常的好方法是什么。

catch (Exception e) {
    if (e instanceof PSQLException || (e.getCause() != null && e.getCause().getMessage().contains("already exists"))) {
        String errMsg = e.getCause().getMessage();
        if (errMsg.contains("already exists")) {
            errMsg = errMsg.substring(errMsg.indexOf('"') + 1, errMsg.lastIndexOf('"'));
        }
        userResponse.setMessage("ExistedUser");
        userResponse.setValue(errMsg);
    } else if (e instanceof SQLIntegrityConstraintViolationException || e.getLocalizedMessage().contains("SQLIntegrityConstraintViolationException")) {
        userResponse.setMessage("Duplicate");
    }
}

看看回調設計模式 基本上,您在代碼中使用接口實例,其實現處理異常/數據庫事務。 你可以有類似的東西:

public interface DatabaseQuery {
    public void execute();
}

public class OracleQuery implements DatabaseQuery {

@Override
public void execute() {
   //run query, catch exceptions etc.

}

}

public class PostgresQuery implements DatabaseQuery {

@Override
public void execute() {
   //run query, catch exceptions etc.

}

}

然后在您需要執行數據庫事務的代碼中,傳入此接口的實例:

public class TestQuery {
    DatabaseQuery query;

    public TestQuery(DatabaseQuery query) {
          this.query = query;
    }

    public void SomeDatabaseStuff() {
        //some code
        // need to work with the db
        query.execute();
        //some more code
    }
}

您不必擔心它的Oracle或Postgres,實現將在幕后處理。

在您的控制器方法中,只要您已經注冊了異常處理程序來正確處理它們,您就可以允許異常冒泡,這只是spring為您提供處理異常的幾種方法之一,請參閱https://spring.io/blog / 2013/11/01 / exception-handling-in-spring-mvc更全面的例子

暫無
暫無

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

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