Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
372 views
in Technique[技术] by (71.8m points)

项目中碰到spring的aspectj失效问题

业务层的service是继承了baseservice,在baseservice中用了泛型注入具体的dao和entity实现了基本的增删查改操作,具体形式如下:

public interface BaseService<T>{}
public class BaseServiceImpl<D extends BaseMapper<T>, T extends BaseEntity<T>> implements BaseService<T>{}

业务类实现形式如下:

public interface UserService extends BaseService<User>{}
public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implements UserService{}

然后在具体的业务类中会根据需求重写baseservice的方法,并且用annotation做了切面,现在发现一个问题,在baseservice中用泛型做参数的方法无法无法实现切面操作,不能被aspect拦截。比如
baseservice中定义了这样一个方法:

int update(T entity)

在业务类中重写如下:

@annotation
    public int update(final User entity) {
        return super.update(entity);
    }

会出现annotation无法拦截到这个方法的情况,但是如果baseservice中方法的参数里不用泛型就没问题,比如另外一个方法:

T get(String id)

业务service重写如下:

@annotation
public User get(final String uuid) {
    return super.get(uuid);
}

这种写法就能被aop正常代理。

aop的拦截方法写法如下:

@Around("@annotation(annotation)")

目前项目是正常在运行,所以aop本身是有效的,出现的问题是做某些方法改造的时候发现的。不清楚aspect在什么情况下会出现无效的情况,网上找了不少资料似乎也没有一个讲得很清楚的,特别是对这种因为泛型引起的失效问题,不知道有没有人碰到过?如何解决?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
等待大神解答

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...