标签: aspectj

如何使用Spring AOP(AspectJ样式)访问方法属性?

我需要通过使用注释作为切入点来接受一些方法及其属性,但是如何访问这些方法属性.我有以下代码,可以在方法运行之前成功运行代码,但我只是不知道如何访问这些attrbiutes.

package my.package;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class MyAspect {

 @Pointcut(value="execution(public * *(..))")
 public void anyPublicMethod() {
 }

 @Around("anyPublicMethod() && @annotation(myAnnotation )")
 public Object myAspect(ProceedingJoinPoint pjp, MyAnnotation myAnnotation)
    throws Throwable {

  // how can I access method attributes here ?
  System.out.println("hello aspect!");
  return pjp.proceed();
 }
}
Run Code Online (Sandbox Code Playgroud)

java aop aspectj spring-aop

9
推荐指数
2
解决办法
2万
查看次数

如何在AspectJ中的AfterThrowing中吞下异常

在AspectJ中,我想吞下一个异常.

@Aspect
public class TestAspect {

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

 @AfterThrowing(pointcut = "throwableMethod()", throwing = "e")
 public void swallowThrowable(Throwable e) throws Exception {
  logger.debug(e.toString());
 }
}

public class TestClass {

 public void testThrowable() {
  throw new Exception();
 }
}
Run Code Online (Sandbox Code Playgroud)

上面,它没有吞下异常.testThrowable()的调用者仍然收到异常.我希望来电者不要收到例外.怎么办呢?谢谢.

java aspectj

8
推荐指数
2
解决办法
4497
查看次数

NoSuchMethodError aspectOf()在运行时从使用iajc构建

我们使用aspectJ来获取现有应用程序的一些指标.在eclipse中使用AJDT进行构建和编织时,一切都很有效.但在整合环境中.我们使用ant脚本来构建和部署应用程序.

问题发生在ExceptionHandler上我确实我们的方面不会抛出异常并破坏应用程序

@Aspect
public class ExceptionHandlerAspect {

    /**
     * Pointcut
     */
    @Pointcut("within(com.xxx.yyy.aop.aspect.*..*)")
    public void allMethodInAspectPackage() {}

    /**
     *  Pointcut
     */
    @Pointcut("!within(com.xxx.yyy.aop.aspect.ExceptionHandlerAspect)")
    public void notInExceptionHandlerAspectClass() {}
    /**
     *  Pointcut
     */
    @Pointcut("call(* *(..))")
    public void allClassAndMethod() {}

    /**
    @Around("allClassAndMethod() && allMethodInAspectPackage() && notInExceptionHandlerAspectClass()")
    public Object logException(ProceedingJoinPoint joinPoint) throws Throwable{
        Object ret = null;
        try {
            ret = joinPoint.proceed();
        }catch (Throwable exception) {
            if (joinPoint.getSignature().getDeclaringTypeName().equalsIgnoreCase("org.aspectj.lang.ProceedingJoinPoint")) {
                throw exception;
            }
            this.logException.info("Exception in " + joinPoint.getSignature().getDeclaringTypeName(),exception);
        }finally {
            return ret; 
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

基本上,我想拦截我的方面包中的每个调用,除了在ExceptionHandler本身.

ant …

aspectj

8
推荐指数
1
解决办法
9117
查看次数

访问方面类中的类变量

我正在创建一个带有spring aspectj的方面类,如下所示

@Aspect
public class AspectDemo {
  @Pointcut("execution(* abc.execute(..))")
     public void executeMethods() { }

 @Around("executeMethods()")
    public Object profile(ProceedingJoinPoint pjp) throws Throwable {
            System.out.println("Going to call the method.");
            Object output = pjp.proceed();
            System.out.println("Method execution completed.");
            return output;
    }

} 
Run Code Online (Sandbox Code Playgroud)

现在我想访问类abc的属性名称然后如何在方面类中访问它?我想在profile方法中显示abc类的name属性

我的abc课程如下

public class abc{
String name;

public void setName(String n){
name=n;
}
public String getName(){
 return name;
}

public void execute(){
System.out.println("i am executing");
}
}
Run Code Online (Sandbox Code Playgroud)

如何访问方面类中的名称?

java spring aspectj spring-aop java-ee

8
推荐指数
1
解决办法
9142
查看次数

当双代理接口时,Spring AspectJ失败:无法生成类的CGLIB子类

我正在使用Spring <aop:aspectj-autoproxy />来代理一些JPA存储库接口.

但是,代理失败的情况如下Cannot subclass final class class $Proxy80:

无法生成类[class $ Proxy80]的CGLIB子类:此问题的常见原因包括使用最终类或不可见类; 嵌套异常是java.lang.IllegalArgumentException:不能继承最终类class $ Proxy80

由于错误和快速谷歌建议 - 当代理目标是最终类时会发生这种情况.但是,在这个链中,没有类 - 只有接口.Spring在运行时生成所有实现.

这是失败的接口的定义:

public interface AuthorDAO extends
    CrossStoreJpaRepository<Author,Long>, CrossStoreQueryDslPredicateExecutor<Author> {

}
Run Code Online (Sandbox Code Playgroud)

注意我正在使用spring的JpaRepositoryQueryDslPredicateExecutor的自定义子类,定义如下:

public interface CrossStoreJpaRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {}
public interface CrossStoreQueryDslPredicateExecutor<T> extends QueryDslPredicateExecutor<T>{}
Run Code Online (Sandbox Code Playgroud)

在其他地方,我在这些接口上定义方法的自定义方面:

@Aspect
@Component
public class DocumentLoadingAspect extends AbstractDocumentAspect {

    @Around("execution(* com.mangofactory.crossstore.repository.CrossStore*.find*(..))")
    public Object loadCrossStoreEntity(ProceedingJoinPoint pjp) throws Throwable
    {
         // implementation omitted
    }
Run Code Online (Sandbox Code Playgroud)

我已经确认这些@Aspect定义是通过删除它们并重新运行应用程序而导致问题的.

导致此错误的原因是什么?似乎代理代理由于某种原因失败了.

java spring aspectj

8
推荐指数
1
解决办法
4470
查看次数

AspectJ和Maven警告:"......中定义的建议尚未应用?"

我试图在编译时将一些方面编织成一个成为WAR的项目.这些方面建议在同一个项目中的类(尽管在不同的包中).

我收到警告:

Advice not applied
Run Code Online (Sandbox Code Playgroud)

我的方面没有被执行.这是我的设置:

注释FooAnnotation.java:

package a;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface FooAnnotation {}
Run Code Online (Sandbox Code Playgroud)

方面FooAdvice.aj:

package a;
public aspect FooAdvice {
    private static final Log log = LogFactory.getLog(FooAdvice.class);

    Object around() : call( @FooAnnotation * *(..)) {   
        log.info(String.format("Testing around"));
        return proceed();
    }
}
Run Code Online (Sandbox Code Playgroud)

我也试过了注释:

@Around("call( @FooAnnotation * *(..))")
public Object checkFoo( ProceedingJoinPoint joinPoint) throws Throwable {
Run Code Online (Sandbox Code Playgroud)

据我所知,我的切入点规范是正确的,但由于某种原因,ajc编译器没有打球.

类FooClass.java:

package b;
@ApplicationPath("/service")
@Path("/{param}")
@Produces("application/json")
@Provider
public class FooClass {

    @POST
    @PUT
    @Path("/{context}/{resource}")
    @FooAnnotation
    public String updateResource(...) {}
Run Code Online (Sandbox Code Playgroud)

pom.xml中:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" …
Run Code Online (Sandbox Code Playgroud)

java aspectj web-applications jax-rs maven

8
推荐指数
1
解决办法
9254
查看次数

Android Studio和MonkeyTalk?

有没有人成功使用Android Studio设置MonkeyTalk?

我在这一点上的主要问题是我没有看到将java编译器设置为aspectj的方法

我相信在custom_rules.xml中有一些方法可以做到这一点,但我还没有看到如何做到这一点.

这导致了一个可能无关的问题,但在我使用的最新版Android Studio(0.1.1)中,我没有看到从Android Studio内部运行ant构建的方法.

任何建议赞赏!

ant android aspectj monkeytalk android-studio

8
推荐指数
2
解决办法
4334
查看次数

Spring AOP使用AspectJ工作还是什么?

我正在研究Spring AOP,我有以下疑问.

据我所知,有两种方法可以将AOP行为实现到Java应用程序中:

  1. AspectJ:这是第一个使用字节码修改进行方面编织的原始AOP技术.

  2. Spring AOP:基于Java的AOP框架,使用AspectJ集成,使用动态代理进行方面编织.

我的疑问是:究竟什么意味着Spring AOP是一个带有AspectJ集成的AOP框架?那么它依次使用AspectJ?或者是什么?

第二个疑问与Spring AOP的Spring配置有关,我知道我可以这样做:

1)使用Java配置类:

@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages=“com.example”)
public class AspectConfig {
    ...
}
Run Code Online (Sandbox Code Playgroud)

2)使用XML:

<beans>
    <aop:aspectj-autoproxy />
    <context:component-scan base-package=“com.example” />
</beans>
Run Code Online (Sandbox Code Playgroud)

因此,在两种配置中,Spring AOP似乎都使用AspectJ,因为在这些配置中我有:@EnableAspectJAutoProxy

它究竟意味着什么?

java aop spring aspectj spring-aop

8
推荐指数
1
解决办法
845
查看次数

如何使用 SpringBootTest 测试方面?

我使用 Spring Boot 2.1.6.RELEASE 在 Spring 中创建了一个简单的方面。它基本上记录了在方法上花费的总时间。

@Aspect
@Component
public class TimeLoggerAspect {

  private static final Logger log = LoggerFactory.getLogger(TimeLoggerAspect.class);

  @Around("@annotation(demo.TimeLogger)")
  public Object methodTimeLogger(ProceedingJoinPoint joinPoint) 
          throws Throwable {
    long startTime = System.currentTimeMillis();

    Object proceed = joinPoint.proceed();

    long totalTime = System.currentTimeMillis() - startTime;
    log.info("Method " + joinPoint.getSignature() + ": " + totalTime + "ms");

    return proceed;
  }
}
Run Code Online (Sandbox Code Playgroud)

方面由TimeLogger注释触发

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TimeLogger {
}
Run Code Online (Sandbox Code Playgroud)

并在这样的组件中使用

@Component
public class DemoComponent {
  @TimeLogger
  public void sayHello() {
    System.out.println("hello");
  } …
Run Code Online (Sandbox Code Playgroud)

java aop aspectj spring-boot

8
推荐指数
4
解决办法
7205
查看次数

Intellij + Ajc + Lombok/Mapstruct

我想在我的 IntelliJ Idea 中启用 AspectJ 编译器,因为我想在编译时编织几个方面。

同时,我在我的代码库中使用 Lombok 和 Mapstruct。

这两个需要额外的注释处理,这必须在ajc开始之前发生。我为 Lombok 和 Mapstruct 安装了两个插件。它们独立工作正常,正在生成源代码。但是当我启用ajc并勾选Enable annotation processing options,然后构建一个项目时,我得到:

Error:(9, 0) ajc: Internal error in the mapping processor: java.lang.NullPointerException   at org.aspectj.org.eclipse.jdt.internal.compiler.lookup.FieldBinding.sourceField(FieldBinding.java:425)     at org.aspectj.org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl$SourceLocationComparator.determineSourceStart(TypeElementImpl.java:108)      at org.aspectj.org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl$SourceLocationComparator.getSourceStart(TypeElementImpl.java:72)     at org.aspectj.org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl$SourceLocationComparator.compare(TypeElementImpl.java:65)    at org.aspectj.org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl$SourceLocationComparator.compare(TypeElementImpl.java:1)     at java.util.TimSort.countRunAndMakeAscending(TimSort.java:360)     at java.util.TimSort.sort(TimSort.java:234)     at java.util.Arrays.sort(Arrays.java:1512)      at java.util.ArrayList.sort(ArrayList.java:1462)    at java.util.Collections.sort(Collections.java:175)     at org.aspectj.org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl.getEnclosedElements(TypeElementImpl.java:166)    at org.mapstruct.ap.internal.util.workarounds.SpecificCompilerWorkarounds.replaceTypeElementIfNecessary(SpecificCompilerWorkarounds.java:99)    at org.mapstruct.ap.internal.util.Executables.getAllEnclosedExecutableElements(Executables.java:99)     at org.mapstruct.ap.internal.model.common.Type.getAllMethods(Type.java:633)     at org.mapstruct.ap.internal.model.common.Type.getPropertyReadAccessors(Type.java:496)      at org.mapstruct.ap.internal.model.BeanMappingMethod$Builder.build(BeanMappingMethod.java:168)      at org.mapstruct.ap.internal.processor.MapperCreationProcessor.getMappingMethods(MapperCreationProcessor.java:376)      at org.mapstruct.ap.internal.processor.MapperCreationProcessor.getMapper(MapperCreationProcessor.java:151)      at org.mapstruct.ap.internal.processor.MapperCreationProcessor.process(MapperCreationProcessor.java:122)    at org.mapstruct.ap.internal.processor.MapperCreationProcessor.process(MapperCreationProcessor.java:76)     at org.mapstruct.ap.MappingProcessor.process(MappingProcessor.java:283)     at org.mapstruct.ap.MappingProcessor.processMapperTypeElement(MappingProcessor.java:263)    at org.mapstruct.ap.MappingProcessor.processMapperElements(MappingProcessor.java:221) …
Run Code Online (Sandbox Code Playgroud)

aspectj intellij-idea mapstruct intellij-lombok-plugin

8
推荐指数
2
解决办法
2382
查看次数