2008-09-02 27 views
7

Dự án của tôi dựa trên khung mùa xuân 2.5.4. Và tôi cố gắng thêm các khía cạnh cho một số bộ điều khiển (tôi sử dụng aspectj 1.5.3).Aspectj không nắm bắt tất cả các sự kiện trong khung mùa xuân?

Tôi đã kích hoạt tính năng tự động proxy trong ứng dụng servlet.xml, chỉ cần dán những dòng này vào cuối của tập tin xml:

<aop:aspectj-autoproxy /> 
<bean id="auditLogProcessor" class="com.example.bg.web.utils.AuditLogProcessor" /> 

Created khía cạnh:

package com.example.bg.web.utils; 

import org.apache.log4j.Logger; 
import org.aspectj.lang.annotation.After; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Pointcut; 

@Aspect 
public class AuditLogProcessor 
{ 
    private final static Logger log = Logger.getLogger(AuditLogProcessor.class); 

    @After("execution(* com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail(..))") 
    public void afterHandleRequest() { 
     log.info("test111"); 
    } 

    @After("execution(* com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail(..))") 
    public void afterRebuildThumbnail() { 
     log.info("test222"); 
    } 
}

điều khiển của tôi:

class AssetAddController implements Controller 
class AssetThumbnailRebuildController extends MultiActionController

Khi tôi đặt điểm phanh trong cố vấn khía cạnh và gọi bộ điều khiển, tôi chỉ bắt sauHandleRequest() nhưng không phải sauRebildThumbnail() Tôi đã làm gì sai?

LƯU Ý

Tôi hỏi câu hỏi này thay mặt cho người bạn của tôi không có quyền truy cập vào SO beta, và tôi không có một đầu mối những gì nó là tất cả về.

EDIT thực

Đã có một số lỗi chính tả, nhờ Cheekysoft. Nhưng vấn đề vẫn còn tồn tại.

Trả lời

2

breakpoint của bạn không bị trúng bởi vì bạn đang sử dụng AOP Proxies Spring. Xem understanding-aop-proxies để biết mô tả về cách AOP proxy là đặc biệt. Về cơ bản, khung MVC sẽ gọi phương thức handleRequest trên proxy của trình điều khiển của bạn (ví dụ như MultiActionController mà bạn đang sử dụng như là một lớp cơ sở thực hiện), phương thức này sau đó sẽ thực hiện một cuộc gọi "internal" tới rebuildThumbnail của nó , nhưng điều này sẽ không đi qua proxy và do đó sẽ không nhận bất kỳ khía cạnh nào. (Điều này không liên quan gì đến phương pháp cuối cùng.)

Để đạt được những gì bạn muốn, hãy điều tra bằng cách sử dụng AOP "thực" qua thời gian tải (mà Spring hỗ trợ rất độc đáo).

0

Điều này đơn giản như chính tả? hoặc chỉ có lỗi chính tả trong câu hỏi? Đôi khi bạn viết rebuildThumbnail và đôi khi bạn viết rebildThumbnail

Các phương pháp bạn đang cố gắng để ghi đè lên với lời khuyên là không phương pháp cuối cùng trong khuôn khổ MVC, vì vậy trong khi bpapas Câu trả lời là hữu ích, hiểu biết của tôi là đây không phải là vấn đề ở đây trường hợp. Tuy nhiên, hãy đảm bảo rằng hành động của trình điều khiển rebuildThumbnail không phải là cuối cùng

@bpapas: hãy sửa tôi nếu tôi sai. Hành động của bộ điều khiển riêng của lập trình viên là những gì anh ta đang cố gắng ghi đè. Nhìn vào nguồn MultiActionController (và cha mẹ của nó ') chỉ có phương pháp cuối cùng có khả năng trong ngăn xếp là MultiActionController.invokeNamedMethod, mặc dù tôi không chắc chắn 100% nếu điều này sẽ có trong ngăn xếp tại thời điểm đó hay không. Sẽ có một phương pháp hoàn thiện cao hơn ngăn xếp gây ra một vấn đề thêm lời khuyên AOP để một phương pháp tiếp tục xuống?

1

Thiết lập cơ bản có vẻ ổn.

Cú pháp có thể được đơn giản hóa một chút bằng cách không xác định một điểm cắt tại chỗ và chỉ định phương pháp áp dụng lời khuyên sau. (Các phím tắt được đặt tên cho các phương thức được tạo tự động cho bạn.)

ví dụ:

@After("com.example.bg.web.controllers.assets.AssetAddController.handleRequest()") 
public void afterHandleRequest() { 
    log.info("test111"); 
} 

@After("com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail()") 
public void afterRebuildThumbnail() { 
    log.info("test222"); 
} 

Miễn là phương pháp xây dựng lạiThumbnail không phải là cuối cùng và tên và lớp phương pháp là chính xác. Tôi không hiểu tại sao điều này không hiệu quả.

thấy http://static.springframework.org/spring/docs/2.0.x/reference/aop.html

Các vấn đề liên quan