Eclipse中的AspectJ - 更改后的项目清理

时间:2015-11-18 08:33:28

标签: java eclipse aspectj aspect

Eclipse和AspectJ的问题非常烦人。在方面影响的类中的每次更改之后,我需要进行完整的项目重建(清理)。 任何人都知道如何避免这种情况?

package pl.xxx.infrastructure.jdbc;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.DeclareParents;
import org.aspectj.lang.annotation.Pointcut;

import pl.xxx.infrastructure.jdbc.common.UpdateEntityInterface;

@Aspect
public class UpdateEntityAspect {

    /**
     * Wyszukiwanie wszystkich klas z adnotacją Entity
     */
    @Pointcut("within(@javax.persistence.Entity pl.xxx..*)")
    public void beanAnnotatedWithEntity() {
    }

    /**
     * Wyszukiwanie wszystkich metod z nazwą rozpoczynającą się od set
     */
    @Pointcut("execution(public * set*(..))")
    public void setMethod() {
    }

    /**
     * Wyszukiwanie wszystkich pol w momencie zmodyfikacji ich stanu
     */
    @Pointcut("set(private * *)")
    public void privateField() {
    }

    /**
     * Nadawanie encji dodatkowego interfejsu / wstrzykiwanie dodatkowych pol
     */
    @DeclareParents(value = "@javax.persistence.Entity pl.xxx..*", defaultImpl = UpdateEntityInterface.UpdateEntityInterfaceImpl.class)
    UpdateEntityInterface updateEntityInterface;

    /**
     * Kod wstrzykiwany podczas modyfikowania pola encji
     * 
     * @param joinPoint
     * @param entity
     */
    @Before("beanAnnotatedWithEntity() && privateField() && target(entity)")
    public void onSetExecuted(JoinPoint joinPoint, Object entity) {
        if (entity instanceof UpdateEntityInterface) {
            UpdateEntityInterface updateEntityInterface = (UpdateEntityInterface) entity;
            updateEntityInterface._markUpdated(joinPoint.getSignature().getName());
        }
    }

}

Aspect影响下的类:

package pl.xxx.model.entity;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.apache.commons.lang3.StringUtils;

@Entity
@Table(name="CUSTOMER")
public class Customer implements Serializable {

    private static final long serialVersionUID = 9128787620983157104L;

    @Id
    @SequenceGenerator(name="IdGenerator", sequenceName="SEQ_CUSTOMER", allocationSize=1)
    @Column(name="ID", unique=true, nullable=false, precision=15, scale=0)  
    protected Long id;

    @Column(name="FILE_TYPE", length=3)
    @CorelatedEnum(IncomingFileType.class)
    private String fileType;
}

错误:Customer类型必须实现继承的抽象方法UpdateEntityInterface._getUpdatedFields()Customer.java第17行Java问题

1 个答案:

答案 0 :(得分:0)

  1. 使用Andy Clement解决方案 - DeclareMixin而不是DeclareParents
  2. 尝试将您的方面类作为默认的弹簧方面放入其他lib(项目)中。如果你是hava maven项目,你可以按如下方式添加它们

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <configuration>
                <aspectLibraries>
                    <aspectLibrary>
                        <groupId>...</groupId>
                        <artifactId>...</artifactId>
                    </aspectLibrary>
                </aspectLibraries>
            </configuration>
        </plugin>