当前位置: 首页 > 知识库问答 >
问题:

Spring AOP在Spring Boot 2.1.6应用程序中没有被调用

娄飞鸾
2023-03-14

在谷歌上关注了这么多关于这个主题的搜索结果后,我的方面在我的Spring启动应用程序上仍然不起作用

我使用的是spring boot版本2.1.6,它似乎已经有了spring aop、aspectjweaver和aspectjrt(有待更正)。我创建了一个注释、方面组件,并在目标类上使用了注释,但没有成功。

这是我的注释类

    import java.lang.annotation.Retention;
    import java.lang.annotation.Target;

    import static java.lang.annotation.ElementType.*;
    import static java.lang.annotation.RetentionPolicy.RUNTIME;

    @Retention(RUNTIME)
    @Target({TYPE, METHOD})
    public @interface AopAudit {
    }

我的aspect类

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

    @Aspect
    @Component
    public class AuditAnnotationAspect {
        @Before("execution(* com.rainestech.hrm.modules.settings.entity.ABC.set*(..))")
        public void before(JoinPoint joinPoint) {
    System.out.println("Audit Works!!! = ");
        }
    }

ABC类

@Entity
@AopAudit
public class ABC {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @NotEmpty
    @NotNull
    @Column
    private String name;

    //... getters and setters
}

配置类

@Configuration
@EnableWebSecurity
@EnableAspectJAutoProxy
public class WebSecurity extends WebSecurityConfigurerAdapter {

}

在ABC类上运行应用程序并运行set方法不会产生任何效果,而我希望在控制台中看到审计工作

共有2个答案

薛望
2023-03-14

只是一个非常愚蠢的评论,因为我花了一天时间:-(。不要忘记@Autowire youre注释对象。AOP通常只有在您通过@Component扫描的上下文解析所有内容时才有效!

//This will work : Resolve everything trough the @Component container context
@Autowired
FeatureAnnotationAspect aspspectTest;

@Test
public void testAnnotationIntersception() 
{
    log.debug("TestFeatureFlagAspect::testAnnotationIntersception");
   //This wont work! You need to Autowire the object to get all annotations and AOP working!
    //aspcetTest = new FeatureAnnotationAspect();
    aspectTest.Annotate(0);
} 
冷正信
2023-03-14

首先,确保您的pom。xml包含以下所有内容:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.2.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
</dependencies>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>1.4</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>test-compile</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

其次,用enableapectjautoproxy注释您的配置,这将启用它。

第三,确保更新切入点:

@Pointcut("@annotation(com.path.to.your.annotation.AopAudit)")
private void auditable() {}

然后在您的之前使用它。

@Before("auditable()")

另一个需要注意的重要事项是,不能执行位于同一类上的方法切入点。更多信息请点击此处。

 类似资料:
  • 我正在运行vertx的本地实例。路由器将我的请求重定向到具有以下处理程序的工作顶点: processRequest函数接受请求主体,调用两个外部服务,聚合响应,然后返回给客户端。 当我点击上面的API时,我的请求超时。为执行我的请求而分配的工作线程池中的线程将永远在Tag1被阻止。进一步调试后,我发现Tag2中调用的应答处理程序没有被调用。 ServiceVerticle(ServiceVerti

  • 问题内容: 您能帮忙检查一下为什么doFilter没有被调用吗 web.xml: 类签名: 调用http:// localhost:8080 / hello / world时 返回404 ,我在doFilter处设置了断点,看来doFilter没有被调用?(我尝试了tomcat 6.0.18、6.0.29,jdk1.6) 问题答案: 在以下情况下将不会调用该过滤器: 过滤器类在类路径中丢失和/或不

  • 我正试图使用mod\u wsgi在Apache web服务器上部署我的flask应用程序。部署后,当我转到配置为返回简单文本消息的“healthCheck”URL时,应用程序没有响应,正在超时。 这是我的wsgi文件: 我在apache日志中也没有看到任何错误。可能是什么问题?请问我是否需要任何额外的详细信息。

  • 问题内容: 我在告诉Android 方向更改时不打电话时遇到了麻烦。我已添加到清单中,但仍在调用方向更改时添加。这是我的代码。 AndroidManifest.xml SearchMenuActivity.java 还有我的LogCat输出 有人知道我在做什么错吗?谢谢。 问题答案: 要尝试的几件事: 而不是 确保您没有在任何地方打电话。这将导致onConfigurationChange()无法触

  • 问题内容: 我正在尝试在Angular中实现d3指令,这很困难,因为在视觉上什么也没有发生,并且在控制台上没有抛出任何错误。 这是我的d3指令: 这是我的HTML: 起初我以为不是要附加,因为要检查看起来像的元素,但是现在我认为该指令根本没有在运行。我从一开始就将其嵌入其中,也没有出现。我缺少简单的东西吗? 编辑: 我尝试将顶行更改为 但这也不起作用。我什至不知道两个标题之间有什么区别… 问题答案