2014-05-12 21 views
6

Tôi muốn chạy một số mã trước mọi phương thức trong một Spring (3.2.3) @Controller. Tôi đã xác định sau nhưng nó sẽ không chạy. Tôi nghi ngờ rằng biểu thức chỉ đường không chính xác.Phím tắt AOP mùa xuân cho tất cả các phương pháp trong bộ điều khiển

phối-servlet.xml

<aop:aspectj-autoproxy/> 
<bean class="com.example.web.controllers.ThingAspect"/> 

c.e.w.c.ThingAspect

@Pointcut("execution(com.example.web.controllers.ThingController.*(..))") 
public void thing() { 
} 

@Before("thing()") 
public void doStuffBeforeThing(JoinPoint joinPoint) { 
    // do stuff here 
} 
+1

Có lẽ một [ '@ ControllerAdvice'] (http://docs.spring.io/spring/docs/4.0.3.RELEASE/javadoc-api/org/springframework/web/bind/annotation/ControllerAdvice .html) là những gì bạn đang tìm kiếm. –

+0

Có phải (a) không chạy ở tất cả hoặc (b) không chạy cho một số phương pháp? Điều này sẽ giúp chẩn đoán vấn đề của bạn. – Phil

+0

Tôi không biết ControllerAdvice tồn tại nhưng nhìn vào tài liệu hướng dẫn để đính kèm ExceptionHandler, InitBinder và ModelAttribute vào một số bộ điều khiển. Tôi đã tìm kiếm một cái gì đó để chạy trước khi mọi phương pháp mà trong trường hợp của tôi là tất cả các phương thức chú thích RequestMapping. Hiện tại, Aspect không được gọi cho bất kỳ phương pháp nào. Tôi có thể sử dụng một Interceptor mùa xuân nhưng AOP dường như lý tưởng phù hợp với nhiệm vụ. – Goose

Trả lời

4

Biểu thức lối tắt của bạn thiếu kiểu trả về như void, String hoặc *, ví dụ:

execution(* com.example.web.controllers.ThingController.*(..)) 
7

Cách đúng để làm điều đó trong các phiên bản hiện tại của Spring MVC là thông qua một ControllerAdvice.
Xem: Advising controllers with the @ControllerAdvice annotation

Đối với các phiên bản trước, hãy tham khảo câu trả lời này của tôi: https://stackoverflow.com/a/5866960/342852

+0

Điều này phải được đánh dấu là câu trả lời được chấp nhận ... – kaqqao

+0

@kaqqao Tôi không đồng ý, '@ ControllerAdvice' chỉ có một tập hợp các khả năng cụ thể. Bạn có thể chặn mọi phương thức '@ RequestMapping' bằng cách sử dụng' @ ModelAttribute', nhưng bạn chỉ có ngữ cảnh của 'Mô hình' và không có gì khác. Tôi nghĩ bạn nên upvote @geoand, mặc dù tôi đã không nhìn vào Spring MVC đánh chặn, tôi tin rằng 'ControllerAdvice' là không đủ mạnh. – froginvasion

+0

@geoand câu trả lời thực sự là tốt và tôi đã upvoted nó ngay bây giờ. Tuy nhiên, câu hỏi đã không thực sự nói nhiều về các chi tiết cụ thể, chỉ cần một cái gì đó nên chạy trước mỗi phương pháp và '@ ControllerAdvice' làm điều đó ... – kaqqao

2

Bên cạnh @ControllerAdvice mà đã được đề cập trong câu trả lời khác, bạn nên kiểm tra Spring MVC interceptors.

Về cơ bản, đơn giản hóa AOP cho bộ điều khiển và có thể được sử dụng trong trường hợp @ControllerAdvice không cung cấp đủ năng lượng cho bạn.

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