我試圖將基於Oauth的Oauth2客戶端從普通的Java/Spring移植到Grails,並且遇到了問題。問題的癥結似乎在於Spring Oauth客戶端實現的設計依賴於這樣的假設:從Oauth2RestTemplate拋出的異常將被捕獲到OAuth2ClientContextFilter的catch塊中,從而允許篩選器發出重定向響應(向誓言提供者發送授權請求)。如何繞過Grails異常處理,以便使用Spring Oauth2?
這在普通Java/Spring中正常工作,但在Grails中,GrailsDispatcherServlet被配置爲通過HandlerExceptionResolvers處理所有異常。因此,GrailsExceptionResolver會捕獲Oauth2RestTemplate中引發的異常(在Grails控制器中調用),並且OAuth2ClientContextFilter永遠不會看到該異常,從而破壞了所需的重定向行爲。
我發現所有關於定製Grails異常處理的討論似乎都假定定製的目的是將異常映射到HTTP錯誤代碼或錯誤頁面視圖。但是有沒有什麼方法可以讓Grails簡單地讓一個特定的異常流經未處理的,以便它可以被servlet過濾器捕獲?或者是否可以插入自定義的HandlerExceptionResolver來重新引發異常,而不是返回ModelAndView(如HandlerExceptionResolver的標準期望)?或者還有其他更好的方法讓Grails中的Spring Security客戶端使用Oauth嗎?