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ể.
Đố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? –
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