Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Spring3中将@Aspect与@Controller结合起来?_Java_Model View Controller_Spring_Aop_Aspectj - Fatal编程技术网

Java 如何在Spring3中将@Aspect与@Controller结合起来?

Java 如何在Spring3中将@Aspect与@Controller结合起来?,java,model-view-controller,spring,aop,aspectj,Java,Model View Controller,Spring,Aop,Aspectj,我正在尝试使用@Controller、基于注释的方法来设置Spring3WebMVC项目 package my.package @Controller @RequestMapping("/admin/*") public class AdminMultiActionController { @RequestMapping(value = "admin.htm", method = RequestMethod.GET) public String showAdminSection() {

我正在尝试使用@Controller、基于注释的方法来设置Spring3WebMVC项目

package my.package

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

@RequestMapping(value = "admin.htm", method = RequestMethod.GET)
public String showAdminSection() {
    return "admin";
}
My dispatcher servlet具有以下控制器处理程序:

<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" />
现在这就是它停止工作的地方。 “fooo”从未打印过

可能是这样的,因为切入点(拼写?)对象必须是spring管理的Bean,而my@Controller与DefaultAnnotationHandlerMapping的组合不会被认为是这样的吗

任何帮助都将不胜感激。如果我忘了提供任何信息,请询问。 希望有人能帮我


非常感谢

切入点方法定义切入点,它不会在匹配时被调用,您需要定义实际发生的事情。e、 g

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

啊,上帝。。终于成功了

谢谢你的回复

对于好奇的人:

  • 不要使用组件扫描和DefaultAnnotationHandler获取控制器
  • 将它们连接到SpringXML中
  • 当aop配置位于applicationContext中时,不要在DispatcherServlet中使用上述控制器
  • 将两者移动到DispatcherServlet

  • 阿菲当然是对的:别忘了建议:p


  • 对于第二个chzbrgla,对于稍后查看的人(如我),我的问题在将控制器组件扫描和aop配置移动到dispatcher servlet后得到解决,如下所示:

    ...
    <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>
    ...
    

    当我尝试使用上面提到的方面时,我得到了以下由以下原因引起的错误:java.lang.IllegalArgumentException:error at::0在org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:302)找不到引用的切入点控制器位于org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:207),位于org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。请建议
    <aop:aspectj-autoproxy/>
    
    <bean id="securityInterceptor" class="my.package.service.SecurityInterceptor"/>
    
    package my.package.service
    
    @Aspect
    public class SecurityInterceptor {
    
    @Pointcut("execution(* showAdminSection(..))")// the pointcut expression
    private void foo() {
        System.out.println("fooo");
    }// the pointcut signature
    
    @Before("foo()")
    public void beforeFoo(JoinPoint joinPoint) {
        System.out.println("foooo");
    }
    
    ...
    <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>
    ...
    
    @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.
    }