2010-10-21 7 views
7

मैं @ कंट्रोलर, एनोटेशन-आधारित दृष्टिकोण का उपयोग करके एक स्प्रिंग 3 वेब एमवीसी प्रोजेक्ट स्थापित करने की कोशिश कर रहा हूं।मैं स्प्रिंग 3 में @ कंट्रोलर के साथ @Aspect को कैसे जोड़ सकता हूं?

package my.package 

@Controller 
@RequestMapping("/admin/*") 
public class AdminMultiActionController { 

@RequestMapping(value = "admin.htm", method = RequestMethod.GET) 
public String showAdminSection() { 
    return "admin"; 
} 

मेरे डिस्पैचर-सर्वलेट निम्नलिखित नियंत्रक संचालकों है:

<context:component-scan base-package="my.package" /> 
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> 

webapp आपूर्ति Maven कलाकृतियों के साथ अच्छा चल रहा है:

<dependency> 
<groupId>org.springframework</groupId> 
<artifactId>spring-webmvc</artifactId> 
<version>3.0.2.RELEASE</version> 
</dependency> 

अब मैं @AspectJ AOP जोड़ना चाहते थे ।

<aop:aspectj-autoproxy/> 

applicationContext.xml में प्रासंगिक सेम के साथ-साथ बनाने के लिए यकीन है कि बनाया गया:

<dependency> 
<groupId>org.aspectj</groupId> 
<artifactId>aspectjweaver</artifactId> 
<version>1.6.9</version> 
</dependency> 
<dependency> 
<groupId>org.aspectj</groupId> 
<artifactId>aspectjrt</artifactId> 
<version>1.6.9</version> 
</dependency> 

मेरी applicationContext.xml को जोड़ा गया: मैं libs मिला

<bean id="securityInterceptor" class="my.package.service.SecurityInterceptor"/> 

और शुरू कर दिया @Aspect को बाहर निकालना:

package my.package.service 

@Aspect 
public class SecurityInterceptor { 

@Pointcut("execution(* showAdminSection(..))")// the pointcut expression 
private void foo() { 
    System.out.println("fooo"); 
}// the pointcut signature 

अब यह वह जगह है जहां यह काम करना बंद कर दिया। "fooo" कभी मुद्रित नहीं होता है।

यह हो सकता है, क्योंकि पॉइंटकट (वर्तनी?) ऑब्जेक्ट्स वसंत-प्रबंधित बीन्स होना चाहिए और मेरे @ नियंत्रक को डिफॉल्ट एन्नोटेशन हैंडलर मैपिंग के साथ संयोजन में ऐसा नहीं माना जाता है?

किसी भी मदद की सराहना की जाएगी। अगर मैं कोई जानकारी शामिल करना भूल गया, तो कृपया पूछें। आशा है कि कोई मेरी मदद कर सकता है।

बहुत बहुत धन्यवाद!

उत्तर

3

पॉइंटकट विधि पॉइंटकट को परिभाषित करती है, इसे किसी मैच पर नहीं कहा जाता है, आपको वास्तव में कुछ होने के लिए परिभाषित करने की आवश्यकता होती है। उदाहरण के लिए,

@Before("foo()") 
public void beforeFoo(JoinPoint joinPoint) { 
    System.out.println("foooo"); 
} 
8

अरे भगवान .. अंत में यह काम कर रहा हो गया है!

आपके उत्तर Affe के लिए धन्यवाद!

उत्सुक के लिए:

  1. अपने नियंत्रकों उन्हें वसंत एक्सएमएल में रहते हुए aop डिस्पैचर-सर्वलेट में
  2. क्या कहा है नहीं नियंत्रकों पाने के लिए
  3. तार घटक-स्कैन और defaultannotationhandlers का उपयोग न करें configContext में कॉन्फ़िगरेशन बैठता है।
  4. ले जाएँ दोनों डिस्पैचर-सर्वलेट

  5. बेशक Affe सही है करने के लिए: सलाह मत भूलना: p

+2

प्वाइंट 3 बिट मेरे लिए याद आ रही थी, धन्यवाद :) – Custard

7

दूसरा chzbrgla, करने के लिए जो लोग बाद में (मेरे जैसे इस देखने के लिए), मेरी समस्या इतनी तरह डिस्पैचर सर्वलेट को नियंत्रक घटक स्कैनिंग और aop config जाने के बाद हल हो:

... 
<context:component-scan base-package="com.mypackage.controller"/> 
<!-- Configure aspects. --> 
<bean id="myAspect1" class="com.mypackage.intercept.SiteAccessAspect"/> 

<aop:aspectj-autoproxy proxy-target-class="true"> 
    <aop:include name="myAspect1" /> 
</aop:aspectj-autoproxy> 
... 

आप देख सकते हैं, घटक स्कैनिंग अभी भी मेरे मामले में काम किया। प्रेषक servlet दोनों को स्थानांतरित करने के लिए यह मेरे लिए हल किया।

apspect (इस मामले में myApect1,) के रूप में कॉन्फ़िगर किया गया था:

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

@Pointcut("execution(* *(..))") 
public void method() {} 

@Before("controller() && method()") 
public void doAccessCheck(JoinPoint joinPoint) { 
System.out.println(joinPoint.getSignature()); // For testing purposes. 
} 
+0

जब मैं ऊपर उल्लेख पहलू का उपयोग करने की कोशिश की, i ' java.lang.IllegalArgumentException: :: में त्रुटि 0 संदर्भित नहीं मिल सकता है pointcut नियंत्रक \t org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression (PointcutParser.java:302) पर मीटर नीचे त्रुटि की वजह से हो रही है org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression पर \t (AspectJExpress ionPointcut.java:207) org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression पर \t .............................. ................................................. कृप्या सुझाना –