2014-01-21 63 views
0

我有一個簡單的MVC控制器我與我的自定義註解註釋:定義註解的Spring MVC ResultBinding

@PreAuthorize("hasRole('GESTION_BENEFICIAIRE')") 
@AuthentificationForte(otp = "#{args[0]}",transactionId="#{args[1]}") 
@RequestMapping(value = "/ajouter", method = { RequestMethod.POST, RequestMethod.GET }) 
public String addBeneficiaire(@ModelAttribute("beneficiaireForm") BeneficiaireForm beneficiaireForm, 
           BindingResult result, Model model, Principal principal) { 
    [...] 
} 

我的自定義註解與拋出一個RuntimeException當驗證不成功一個方面的聯繫。

@Around(value = "@annotation(annotation)") 
public Object verifyOtp(final ProceedingJoinPoint jointPoint, 
         final AuthentificationForte annotation) throws Throwable { 
    try { 
    if (authentificationForteEnabled) { 
     [...] 
    } else { 
     throw new AuthentificationForteException(); 
    } 
    } else { 
     return jointPoint.proceed(); 
    } 
    } finally { 

    } 
} 

所以現在的行爲是,當驗證失敗時,我被重定向到500錯誤頁面。我的目標是留在同一個頁面,並添加一個拒絕的消息給BindingResult

result.rejectValue("suiteRib", "BeneficiaireForm.InvalidRib"); 

我還沒有找到一種方法來做到這一點,我發現的唯一方法是改變我所有的邏輯而不是使用註釋,而在控制器代碼中使用帶有try/catch的驗證服務。

有什麼辦法來處理這個問題,並訪問綁定結果並添加錯誤消息時,方面引發此異常?

回答

0

絕對是。

這裏有操縱形式參數的例子: Aspectj overwrite an argument of a method

您還可以自動裝配服務納入方面類(記住,以紀念它@Configurable)。

如果您事先知道參數,那麼我認爲它們可以包含在點切割定義中,在這種情況下,它們可以直接在around方法中引用。隨着爭論的強烈類型,這更好。

你可以在這裏閱讀更多:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html

0

可能爲時已晚來回答你的問題,但有兩種方法可以處理它:在

  1. 有一個嘗試捕捉周圍進行()你方面,當你得到運行時異常時,你可以從方面返回響應(如顯示錯誤原因的通用JSP或帶有錯誤消息的泛型JSON)。
  2. 第二個選項可以使用Spring異常處理程序控制器建議。 Spring MVC提供了很好的異常處理程序控制器機制來爲給定類型的異常類調用特定的處理程序方法。 (這裏是博客鏈接:https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

我們目前有一個應用程序,我們使用這種方法混合處理異常。