2012-07-03 35 views
3

我有兩個有關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問題,而無需爲我想建議的每個類定義接口?

回答

1

你應該在你的類路徑中添加CGLIB dependendy,所以你不需要用AOP

工作看看到doc創建界面。

+0

謝謝。我實際上已經對CGLIB有一個依賴,但它似乎沒有爲webflow操作創建代理。關於控制器,我刪除了AmazingController的要求來實現OutstandingInterface(重構爲服務),這樣就消除了必須爲AmazingController定義接口的解決方法 - 這種方式更好。 –