2015-08-24 16 views
6

Tôi đã tạo một Aspect thực hiện so sánh id cơ bản để đảm bảo rằng người dùng thuộc về cùng một nhóm đã tạo đối tượng được yêu cầu. Tôi đã có thành công gắn khía cạnh của tôi với các phương thức @Service, nhưng nó không có ý nghĩa trên lớp dịch vụ, và tôi cần nó được gắn vào các phương thức @RestController để thay thế. Khi tôi cố gắng làm điều này, mọi thứ có vẻ tốt, nhưng Aspect của tôi không bao giờ kích hoạt, và các bản ghi là im lặng.Spring 4 AOP @Aspect không kích hoạt cho @RestController

pom.xml

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-aop</artifactId> 
    <version>4.1.7.RELEASE</version> 
</dependency> 

bối cảnh mùa xuân

<context:annotation-config/> 
<context:component-scan base-package="my.pkg"/> 
<aop:aspectj-autoproxy/> 
<aop:config proxy-target-class="true"/> 

Aspect

@Aspect 
@Component 
public class MyAspect { 
    @Pointcut("within(@org.springframework.stereotype.Controller *)") 
    public void controller() {} 

@Pointcut("within(@org.springframework.web.bind.annotation.RestController *)") 
    public void restController() {} 

    @Pointcut("args(java.security.Principal,..)") 
    public void principalArgPointcut() {} 

    @Around("(controller() || restController()) && principalArgPointcut()") 
    public Object validate(ProceedingJoinPoint point) throws Throwable { 
     doValidationBefore(); 
     Object result = point.proceed(); 
     doValidationAfter(); 

     return result; 
    } 
} 

nơi "doValidationBefore()" và "doValidationAfter()" sẽ ném một ngoại lệ nếu xác nhận thất bại .

Và cuối cùng, tôi RestController

@RestController 
@RequestMapping("/my-path") 
public class MyController { 
    @RequestMapping(value = "/{entityId}", method = RequestMethod.GET) 
    public @ResponseBody 
    ResponseEntity<MyEntity> getEntityDetails(Principal principal, @PathVariable("entityId") Long entityId) { 
     return new ResponseEntity(HttpStatus.OK); 
    } 
} 

Một số điều cần lưu ý:

  • khía cạnh chính xác này hoạt động khi tôi thay đổi mô hình thực hiện để phù hợp với các dịch vụ và đặt nó trong gói dịch vụ của tôi.
  • Aspect và RestController nằm trong cùng một ngữ cảnh
  • Tôi sử dụng IDEA IDE và khi tôi sử dụng biểu tượng "điều hướng đến phương pháp được khuyến nghị" trên Aspect, phương pháp tôi đang kiểm tra IS được liệt kê trong danh sách các phương pháp .
  • Không ai trong số các phương pháp được liệt kê trong "điều hướng tới các phương pháp khuyến cáo" đang làm việc

Những điều tôi đã cố gắng:

  • tôi đã thêm 3 thư viện để pom.xml của tôi: org.aspectj: aspectjrt: 1.8.6, org.aspectj: aspectjtools: 1.8.6, cglib: cglib: 2.2.2. Không ai trong số này được thực hiện bất kỳ sự khác biệt nào.
  • Tôi đã cố gắng xác định Aspect và PointCuts trực tiếp trong ngữ cảnh xml và xóa chú thích, không có sự khác biệt.
  • Tôi đã thử đặt mẫu thực thi của mình để áp dụng cho TẤT CẢ các phương thức và nó vẫn không kích hoạt.
  • Tôi đã thử thêm giao diện cho RestController của mình, không thay đổi.

Tôi rất muốn được trợ giúp ở đây, vì tôi đã cố gắng giải quyết vấn đề này trong một thời gian ngắn. Tôi biết điều đó là có thể.

Trả lời

6

Khi nó quay ra, Aspect và Bộ điều khiển của tôi KHÔNG, trên thực tế, trong cùng một ngữ cảnh.

Trong khi tôi tin điều khiển của tôi để được bao gồm trong bối cảnh quét của tôi web context.xml, họ đã thực sự được quét trong WEB-INF/servlet-context.xml

Khi tôi chuyển cấu hình Aspect của tôi để WEB-INF/servlet-context.xml, Aspect của tôi bắt đầu kích hoạt như mong đợi.

Cảm ơn tất cả những ai đã dự tính vấn đề của tôi.

+0

Đối mặt với cùng một vấn đề và không thể tìm ra lý do. Bất kỳ đề xuất nào về cấu hình cần kiểm tra? –

+0

Bạn đã lưu ngày của tôi. Tôi googled rất nhiều nhưng vô vọng cho đến khi đọc bài viết của bạn. Cảm ơn nhiều – anhtuangv

0

Tìm hiểu xem dịch vụ của bạn đang được định cấu hình vào mùa xuân hay không. Nếu bạn có tôi có một biểu tượng mà bạn có thể bấm để điều hướng đến cấu hình bean mùa xuân. Sau đó, đảm bảo rằng các khía cạnh được cấu hình trong cùng một tập tin.

Nếu chúng được xác định rõ ràng trong cùng một tệp, hãy xem tiếp theo lời khuyên về lối tắt trên đỉnh phù hợp với phương pháp mà bạn mong muốn nó kích hoạt. Một lần nữa, Idea có một biểu tượng bên cạnh con trỏ sẽ điều hướng đến các phương thức phù hợp.

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