springboot異常處理
做web應用的時候,請求處理過程中發生錯誤是非常常見的情況。spring boot提供了乙個預設的對映:/error,當處理中丟擲異常之後,會轉到該請求中處理,並且該請求有乙個全域性的錯誤頁面用來展示異常內容。但是頁面很不友好,我們需要傳送給一些引數讓前端開發者識別就可以了。
1.狀態碼拋異常
處理web請求時引發的任何未處理的異常都會導致伺服器返回http 500響應。 但是,您自己編寫的任何異常都可以使用@responsestatus注釋(它支援http規範定義的所有http狀態**)進行注釋。 當乙個帶注釋的異常從乙個控制器方法丟擲,而不是在其他地方處理時,它將自動地使用指定的狀態碼返回適當的http響應。
測試用例:
首先寫乙個異常處理類
@responsestatus(value= httpstatus.not_found, reason="找不到內容")
public class tdusernotfoundexception extends runtimeexception
測試類加了乙個註解@responsestatus,就是當出現這個異常的時候的返回狀態。
然後寫controller讓其丟擲tdusernotfoundexception這個異常
執行springboot工程,通過swagger ui工具進行測試,測試結果為:
_100100(100100, "操作失敗,資料校驗失敗,請檢查資料"),
這個方法監控了乙個dataintegrityviolationexception異常,當資料寫入資料庫會對內容進行校驗,看看是否滿足要求,比如非空校驗,使用者名稱的唯一性校驗。
業務方法:
public string createtduser1(tduserdto tduserdto)
如果上面方法出現dataintegrityviolationexception異常會被自動捕捉。
測試:
使用者名稱admin在資料庫已經有了,再次插入會報錯。
3.全域性異常處理
控制器建議允許您使用完全相同的異常處理技術,但將其應用於整個應用程式,而不僅僅是應用於單個控制器。 可以把它們看作是乙個註解驅動的***。
@restcontrolleradvice
@responsebody
public class globalexceptionhandler )
public exceptionbody sqlexception(exception e) ", e.getmessage(), e);
return new exceptionbody(tdresponseinfo._100100);}}
同樣是攔截資料庫檢驗異常,可以專門寫乙個全域性的異常處理類,註解使用
@restcontrolleradvice這樣直接注入到@restcontroller裡面,所有到的contoller出現異常會被自動攔截。
同樣是乙個情景,當使用者註冊乙個username就不能有相同的username,在資料庫裡面新增唯一性約束,然後在實體類也新增約束。
表字段
/** * 使用者名稱
*/@column(nullable = false,name = "username",length = 10,unique = true)
private string username;
controller:controller方法:
public respbodycreatetdrole(tduserdto tduserdto)
tduser.setsalt(tduserdto.getusername());
tduser.setcreatetime(new date());
tduser.setmodifiedtime(new date());
tduser.setlocked(1);
tduser.setremark("安存管理員");
tduser tduserres = tduserservice.createtduser(tduser);
return new respbody<>(tdresponseinfo._100000,tduserres);
}
預計tduser tduserres = tduserservice.createtduser(tduser);行發生異常。
開始測試:
測試結果:
4.自定義異常處理
有的時候需要自定義一些已知的異常,當異常發生終止程式執行,丟擲指定的返回碼和返回資訊。這個時候可以自定義異常攔截。
public class tdexception extends runtimeexception
自定義異常處理器,注入到@restcontroller
@exceptionhandler(tdexception.class)
public exceptionbody tdexceptionhandler(tdexception tdexception)
使用:
if (tarobjrequest == null || tarobjservice.findonebyid(tarobjrequest.getid()) == null){
logger.error("操作物件不存在");
logger.info("操作物件不存在");
throw new tdexception(tdresponseinfo._100104);
這樣就可以通過全域性異常處理攔截自定義異常了。 springBoot異常處理
使得訪問 exception一定會產生異常 some exception controller public class exceptioncontroller return hello 再寫個全域性異常處理類 controlleradvice public class globalexceptio...
Spring Boot 處理異常
原理 略 1 在template下建立error目錄,在error目錄中,建立404.html頁面,如果發生錯誤 為404,就會去找這個頁面 可以建立所有的狀態碼頁面 2 在error目錄中,建立4xx.html頁,如果找不到對應的狀態碼頁面,就會去找4xx.html頁面 注意4xx.html就是4...
springboot異常處理
1.springboot預設發生異常會跳轉到白頁 2.自定義錯誤頁 我們在templates error路徑下新增404.html和5xxhtml 注意使用 thymeleaf 時候,所有的html檔案要新增命名空間 發生404錯誤時,我們就會自動跳轉到404.html 發生5xx錯誤時,我們自動跳...