标签: aspectj

Spring AOP:"找不到元素'aop:config'的声明"

我已经看到已经提出了一些这个问题的实例.但是,我相信我满足这些解决方案中列出的标准.即我很确定我的课程路径上有所需的罐子+我的原理配置地址按顺序查看.

一个解决方案提到该问题可能是由于在类路径上有另一个XML解析器引起的.我在我的类路径上有dom4j,但我已将其删除以进行测试,问题仍然存在.

这是我的类路径:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="src" path="test"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/mysql-connector-java-5.1.18-bin.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/jaxen-1.1.3.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.aop-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.asm-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.aspects-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.beans-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.context.support-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.context-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.core-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.expression-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.instrument.tomcat-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.instrument-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.jdbc-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.jms-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.orm-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.oxm-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.test-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.transaction-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.web.portlet-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.web.servlet-3.1.0.RC1.jar"/>
    <classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.web.struts-3.1.0.RC1.jar"/>
    <classpathentry …
Run Code Online (Sandbox Code Playgroud)

java spring aspectj spring-aop

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

了解Spring AOP

我正在使用Spring 3.0框架,仍然是一个新手.任何人都可以用非专业术语解释我的AOP编程是什么?(一个简短的例子肯定会有帮助)

Spring如何整合/增强/支持它?

java aop spring aspectj

9
推荐指数
4
解决办法
7727
查看次数

暴露AspectJ set-pointcut中的先前值

我必须检测字段值的变化.我想将之前的值与新值进行比较.我不知道字段名称或类型.(更多背景信息.)对于给定类的示例:

package eu.zacheusz.aspectjtries;

@eu.zacheusz.aspectjtries.MyAnnotation
public class Sample {
    private String field;
    public void modify(){
        this.field = "new";
    }
    public static void main(String[] a){
        new Sample().modify();
    }
}
Run Code Online (Sandbox Code Playgroud)

我有这个方面:

    package eu.zacheusz.aspectjtries.aspects;

    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.Aspect;

    @Aspect
    public class SampleAspect {

        @After(" set(!static !final !transient * (@eu.zacheusz.aspectjtries.MyAnnotation *) . *) && args(value) && target(m) ")
        public void afterSetField(Object m, Object value){
            System.out.println("After set field. value=" + value + " target=" + m.getClass());
        }
}
Run Code Online (Sandbox Code Playgroud)

问题是args暴露在字段集合关联点传递的值而不是字段的当前值.第27页的演示中 …

java aop aspectj pointcuts pointcut

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

继续使用AspectJ的变量参数

我正在尝试使用AspectJ规范化应用程序中的URI.我正在捕获使用此代码传递给java.net.URI参数的方法的每个调用:

Object around() : execution(* *(..,java.net.URI,..)) {
    for ( Object arg : thisJoinPoint.getArgs() ) {
        if ( arg instanceof URI ) {
            // normalize
        }
    }
    return proceed();
}
Run Code Online (Sandbox Code Playgroud)

但是,由于URI是不可变的,我无法将规范化值交换到现有对象中.我需要的是调用继续使用新的,规范化的URI对象(并且可能传递其他参数不变).但是,继续调用只允许我传递由连接点收集的参数.有没有办法为可变数量的参数实现这一点(主要是对任何URI参数感兴趣,但愿意收集并传递所有参数)?

java aspectj

9
推荐指数
1
解决办法
7176
查看次数

AspectJ中的类型间声明的简短示例是什么,它证明了该方法的有用性?

我首先考虑使用ITD来定义private static final Logger logger = ...一些不相​​关的案例,但它看起来不像使用它作为演示示例的明显改进.

是否有一些标准/建议的ITD使用示例,人们应该将其用于教学目的?

java logging types aspectj

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

使用AspectJ编写toString()实现

尝试使用编译时编织来编织大量DTO的默认toString()方法.目标是使用Jackson库返回JSON表示.

按照本文中的建议,将其转换为注释样式方面配置,最后得到以下代码:

public @Aspect class JsonToStringAspect {
    private interface JsonToString {
        public String toString();
    }

    public static class JsonToStringImpl implements JsonToString {
        public String toString() {
            return SingletonJsonEncoder.toJsonString(this);
        }
    }

    @SuppressWarnings("unused")
    @DeclareParents(value = "com.mycompany.dto..*", defaultImpl = JsonToStringImpl.class)
    private JsonToString implementedInterface;
}
Run Code Online (Sandbox Code Playgroud)

javap在结果类上运行表明它们实现了JsonToString接口,但是在任何地方都没有toString()方法的迹象.

如果我将方法名称更改为不与Object.toString()发生冲突的内容(例如toString2()),则会真正添加该方法.

关于如何克服这个问题的任何线索?也许@Around对切​​入点的建议拦截java.lang.Object.toString()的执行,仅适用于包下面的子类com.mycompany.dto?还是一种强制混合发生的方法?

java aop aspectj tostring dto

9
推荐指数
1
解决办法
1173
查看次数

AspectJ切入点用于带注释的PRIVATE方法

我想为使用特定注释注释的私有方法创建一个Pointcut.但是,当注释位于如下所示的私有方法时,不会触发我的方面.

@Aspect
public class ServiceValidatorAspect {
    @Pointcut("within(@com.example.ValidatorMethod *)")
    public void methodsAnnotatedWithValidated() {
}

@AfterReturning(
            pointcut = "methodsAnnotatedWithValidated()",
            returning = "result")
    public void throwExceptionIfErrorExists(JoinPoint joinPoint, Object result) {
         ...
}
Run Code Online (Sandbox Code Playgroud)

服务接口

public interface UserService {

    UserDto createUser(UserDto userDto);
}
Run Code Online (Sandbox Code Playgroud)

服务实施

    public class UserServiceImpl implements UserService {

       public UserDto createUser(UserDto userDto) {

             validateUser(userDto);

             userDao.create(userDto);
       }

       @ValidatorMethod
       private validateUser(UserDto userDto) {

            // code here
       }
Run Code Online (Sandbox Code Playgroud)

但是,如果我将注释移动到公共接口方法实现createUser,则会触发我的方面.我应该如何定义切入点或配置我的方面以使我的原始用例工作?

aop spring aspectj spring-aop

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

Aspectj不适用于kotlin

我想在kotlin中使用aspectj aop,这是我的代码:

我在annotation.lazy_list中的注释:

科特林:

 package anotation

@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FUNCTION)
annotation class lazy_list
Run Code Online (Sandbox Code Playgroud)

我的方面是一个类:

@Aspect
class ActiveListAop{

    @Pointcut("execution(@annotation.lazy_list * *(..))")
    fun profile() {

    }

    @Before("profile()")
    fun testModeOnly(joinPoint: JoinPoint) {
        println("123")
    }

}
Run Code Online (Sandbox Code Playgroud)

我的用法:

 @lazy_list
    fun all():List<T>{
        return lazy_obj?.all() as List<T>
    }
Run Code Online (Sandbox Code Playgroud)

当我调用all()函数,没有错误,但不打印"123",为什么?

aop aspectj kotlin

9
推荐指数
3
解决办法
4841
查看次数

AspectJ编译器错误导致StackOverflowError

我今天遇到了AspectJ编译器的StackOverflow错误,我想我应该在StackOverflow上分享它:-)重现错误我做了一个玩具示例

public abstract class Node<T,Q extends Node<T,Q>> implements WithParent<Q>{
    private T content;
    //getter and setter for content
}
public aspect WithParentAspect {
    private T WithParent<T>.parent;
    public T WithParent<T>.getParent() {
        return this.parent;
    }
    public void WithParent<T>.setParent(T parent) {
        this.parent=parent;
    }
}
public interface WithParent<T> { }
public class StringContentNode extends Node<String, StringContentNode>{
    public static void main (String [] args) {
        StringContentNode root = new StringContentNode();
        StringContentNode leaf = new StringContentNode();

        root.setContent("root");
        leaf.setContent("leaf");
        leaf.setParent(root);
        System.out.println(leaf);                   
        System.out.println(leaf.getParent());
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试编译此代码会导致以下错误:

java.lang.StackOverflowError
at org.aspectj.weaver.World$TypeMap.put(World.java:1198) …
Run Code Online (Sandbox Code Playgroud)

java stack-overflow aspectj compiler-bug

9
推荐指数
1
解决办法
285
查看次数

Spring AOP没有@EnableAspectJAutoProxy可以工作吗?

我正在学习Spring(当前是其AOP框架)。即使我阅读过的所有消息都说要启用AOP,也需要使用@EnableAspectJAutoProxy注释(或其XML副本),但我的代码似乎可以注释掉注释。那是因为我使用Lombok还是Spring Boot(v。1.5.9.RELEASE,取决于Spring v。4.3.13.RELEASE)?

最小的示例如下:

build.gradle

buildscript {
    ext {
        springBootVersion = '1.5.9.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'org.springframework.boot'

group = 'lukeg'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}


dependencies {
    compile('org.springframework.boot:spring-boot-starter')
    compileOnly('org.projectlombok:lombok')
    compile("org.aspectj:aspectjweaver:1.8.11")
    testCompile('org.springframework.boot:spring-boot-starter-test')
}
Run Code Online (Sandbox Code Playgroud)

ApplicationConfiguration.java(请注意,AOP注释已被注释掉)

package lukeg;

import org.springframework.context.annotation.*;

@Configuration
@ComponentScan
//@EnableAspectJAutoProxy
public class ApplicationConfiguration {
    @Bean
    TestComponent testComponent() {
        return new TestComponent();
    }
}
Run Code Online (Sandbox Code Playgroud)

LearnApplication.java

package lukeg;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import …
Run Code Online (Sandbox Code Playgroud)

java spring aspectj spring-aop

9
推荐指数
1
解决办法
8231
查看次数