我有兩個有關spring/AspectJ AOP的相關問題。我有記錄在我的應用程序,包括服務,DAOS,控制器和Webflow的行爲有關的任何類拋出的異常的典型記錄儀方面...AspectJ autoproxy問題與彈簧控制器和Webflow操作
@Aspect
public class AspectLogger {
@AfterThrowing(pointcut = "execution(* com.myapp..*.*(..))", throwing = "t")
public void logGustavoException(JoinPoint joinPoint, Throwable t) {
Log logger = LogFactory.getLog(joinPoint.getTarget().getClass());
logger.error(t.getMessage(), t);
}
}
在我的應用程序方面,我有一個同樣典型配置...
<context:annotation-config />
<!-- AOP logging config -->
<aop:aspectj-autoproxy>
<aop:include name="aspectLogger" />
</aop:aspectj-autoproxy>
<bean id="aspectLogger" class="com.myapp.AspectLogger" />
這在大部分情況下工作正常,我遇到的問題是webflow操作和控制器實現接口。
1 - 其中實現一個接口控制器...
我們的一個控制器的實現,其定義了一個方法,以及定義其用作@RequestMapping處理幾個公共方法的接口...
@Controller
public class AmazingController implements OutstandingInterface {
// implements the method from OutstandingInterface
@Override
public Object doSomethingOutstanding(){
...
}
@RequestMapping(value="/amazingUrl.htm", method = RequestMethod.GET)
public String doSomethingAmazing(HttpSession session, ModelMap model) {
return "anAmazingViewName";
}
...
}
這裏,由於該控制器實現,不限定其所有公共方法(即控制器請求映射方法)的接口的事實,爲控制器創建的代理問題只代理了「做OutSomethingOutstanding'的方法dingInterface。因此,當請求到達/amazingUrl.htm時,Spring不會將其路由到適當的請求處理程序 - 就好像請求映射不存在一樣。 我已經通過爲控制器定義了一個接口來解決這個問題,它擴展了OutstandingInterface並且還定義了控制器所需的請求處理程序方法,但是我必須爲控制器定義一個接口似乎很奇怪/錯誤,以至於AspectJ的東西沒有 '隱藏' 請求處理程序 ...
@Controller
public interface IAmazingController extends OutstandingInterface{
@RequestMapping(value="/amazingUrl.htm", method = RequestMethod.GET)
public String doSomethingAmazing(HttpSession session, ModelMap model);
}
...
public class AmazingController implements IAmazingController {
@Override
public Object doSomethingOutstanding(){
...
}
@Override
@RequestMapping(value="/amazingUrl.htm", method = RequestMethod.GET)
public String doSomethingAmazing(HttpSession session, ModelMap model) {
return "anAmazingViewName";
}
...
}
2 - Webflow的操作
第二個問題是非常相似的。引入AspectJ配置後,我的webflow Action類都沒有正確自動裝配 - 我一直在找'找不到類型爲FantasticAction的bean'錯誤。再次,我介紹了所有Action類的接口,並解決了這個問題,因爲它是在運行時注入的代理,而不是實際的操作實現類。
因此最後...在這兩個實例中的問題是 - 有沒有辦法繞過這些AspectJ問題,而無需爲我想建議的每個類定義接口?
謝謝。我實際上已經對CGLIB有一個依賴,但它似乎沒有爲webflow操作創建代理。關於控制器,我刪除了AmazingController的要求來實現OutstandingInterface(重構爲服務),這樣就消除了必須爲AmazingController定義接口的解決方法 - 這種方式更好。 –