2010-07-22 13 views
19

मैं एओपी का उपयोग एनोटेटेड नियंत्रक के बाद कुछ प्रसंस्करण करने के लिए करने की कोशिश कर रहा हूं। सबकुछ बिना किसी त्रुटि के चल रहा है, लेकिन सलाह निष्पादित नहीं की जा रही है।एनोटेटेड नियंत्रकों पर वसंत एओपी सलाह

@Controller 
public class HomeController {  
    @RequestMapping("/home.fo") 
    public String home(ModelMap model) { 
     model = new ModelMap(); 
     return "home"; 
    } 
} 

और आवेदन-config

<aop:aspectj-autoproxy/> 

<bean id="testAdvice" class="com.test.TestAdvice"> 
</bean> 

<bean id="testAdvisor" 
    class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor"> 
    <property name="advice" ref="testAdvice" /> 
    <property name="expression" value="execution(* *.home(..))" /> 
</bean> 

में सेटअप और वास्तविक सलाह

public class TestAdvice implements AfterReturningAdvice { 

    protected final Log logger = LogFactory.getLog(getClass()); 

    public void afterReturning(Object returnValue, Method method, Object[] args, 
      Object target) throws Throwable { 
     logger.info("Called after returning advice!"); 
    } 
} 

यह भी के बारे में सलाह करना संभव है:

यहाँ नियंत्रक कोड है एनोटेटेड नियंत्रक? मैं वसंत 2.5 का उपयोग कर रहा हूँ।

+0

मैं इसे काम करने में कभी सक्षम नहीं था, और दुर्भाग्यवश, मेरे पास काम करने में सक्षम होने के लिए समय समाप्त हो गया है। अभी के लिए मुझे सिर्फ कोड कॉपी करने के साथ रहना होगा। – jdana

+0

आपको अपने 'testAdvisor' बीन को '' में शामिल करने की आवश्यकता है:' ' – xli

उत्तर

1

एमवीसी नियंत्रकों के लिए आप जो करने की कोशिश कर रहे हैं उसे पूरा करने की पसंदीदा विधि इंटरसेप्टर का उपयोग करना है। http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-handlermapping-interceptor

+6

मैं असहमत हूं। पहलुओं को एक ही चीज़ को प्राप्त करने के लिए तर्कसंगत रूप से एक और शानदार तरीका है। – skaffman

+1

जब आप कुछ वेब अनुरोधों को अवरुद्ध करना चाहते हैं तो मेरा सामान्य नियम इंटरसेप्टर का उपयोग करता है। जब आप सामान्य वसंत सेम पर विधियों को रोकना चाहते हैं तो पहलुओं का प्रयोग करें। चूंकि प्रश्न अवरोधक नियंत्रकों (जो वेब अनुरोधों के लिए मैप किए गए हैं) से संबंधित है, इंटरसेप्टर का उपयोग करना अधिक उपयुक्त है। सामान्य रूप से – Sasi

+0

इंटरसेप्टर भयानक हैं। यूआरआई के बारे में कौन परवाह करता है? मैं बिल्कुल एनोटेट करना चाहता हूं कि कौन से नियंत्रकों को तर्क के टुकड़े निष्पादित करना चाहिए। पहलुओं के साथ एनोटेशन यह करने का एकमात्र तरीका है। – Alex

22

एनोटेटेड नियंत्रकों पर सलाह लेना संभव है।

मुझे लगता है कि आप @Controller के साथ एनोटेटेड कक्षाओं में सभी विधियों के निष्पादन के बाद सलाह देना चाहते हैं।

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xsi:schemaLocation=" 
      http://www.springframework.org/schema/aop 
      http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 

    <bean id="controllerAspect" class="controller.ControllerAspect" /> 

    <aop:aspectj-autoproxy> 
     <aop:include name="controllerAspect" /> 
    </aop:aspectj-autoproxy> 
</beans> 

नोट::

import org.aspectj.lang.annotation.AfterReturning; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Pointcut; 

@Aspect 
public class ControllerAspect { 

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

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

    @AfterReturning("controllerBean() && methodPointcut() ") 
    public void afterMethodInControllerClass() { 
     System.out.println("after advice.."); 
    } 
} 

आप AspectJ वाक्य रचना के साथ वसंत AOP का उपयोग करना चाहते हैं, तो आप भी इस तरह की एक विन्यास फाइल की जरूरत है:

यहाँ एक उदाहरण है वसंत AOP के साथ, वसंत कंटेनर केवल स्प्रिंग बीन्स बुनाई करेगा। यदि @Controller ऑब्जेक्ट स्प्रिंग बीन नहीं है, तो आपको AspectJ बुनाई का उपयोग करना होगा।

+0

मैं कैसे बता सकता हूं कि @ नियंत्रक एक बीन है या नहीं?मुझे पता है कि यह @Autowired के माध्यम से निर्भरता प्राप्त कर रहा है, इसलिए मैंने सोचा कि यह एक बीन था, लेकिन मुझे अभी भी पहलू को निष्पादित करने में समस्याएं आ रही हैं। – jdana

+1

यदि ऑटोवॉयरिंग काम करता है और आपके पास वसंत की तुलना में कोई अन्य आईओसी कंटेनर नहीं है, तो यह एक वसंत बीन है। – Espen

+1

मेरे अन्य घटक पहलू के साथ ठीक काम करते हैं लेकिन नियंत्रकों के लिए कोई भाग्य नहीं है। उसी पहलू वर्ग में, मैं नियंत्रक पॉइंटकट्स और सेवा पॉइंटकूट भी परिभाषित करता हूं। सेवा पॉइंटकट काम करते हैं लेकिन नियंत्रक नहीं। क्या ऐसा कोई संकेत है कि ऐसा क्यों होता है? –

2

मुझे वही समस्या थी जहां रिपोजिटरी के लिए सलाह काम कर रही थी, लेकिन नियंत्रक के लिए सलाह नहीं थी। अंत में मुझे एक समाधान मिला। संक्षेप में, आपको यह सुनिश्चित करना होगा कि आपकी एओपी परिभाषा सर्वलेट संदर्भ में लोड हो, न कि एक अलग संदर्भ।

मेरे मामले में, मेरी स्प्रिंग एओपी परिभाषा tools-config.xml में परिभाषित की गई है। इसे यहाँ से आगे बढ़

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath:spring/tools-config.xml</param-value> 
</context-param> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 
यहाँ के

,

<servlet> 
    <servlet-name>petclinic</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath:spring/mvc-core-config.xml, classpath:spring/tools-config.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

के बाद नियंत्रक के लिए सलाह काम कर रहा है।

+0

क्या होगा यदि सब कुछ एनोटेशन के माध्यम से है और एओपी कॉन्फ़िगरेशन के लिए कोई XML फ़ाइल नहीं है? – Dish

संबंधित मुद्दे