scvzerng 2015-07-31 16:06 采纳率: 0%
浏览 2359

spring aspect中的around和transactionManager的问题求解

问题出现的情况是这样的,首先我在xml里面启用了事务注解




然后再另一个类中配置了切面
package test.ssh.advice;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class XMLAspect {
@Pointcut("execution(public * test.ssh.service.*.*(..))")
public void pointCutService(){}

@Before("pointCutService()")
public void before(){
System.out.println("before start");

}
@After("pointCutService()")
public void after(){
System.out.println("after start");
}
@AfterReturning("pointCutService()")
public void afterReturning(){
System.out.println(" afterReturning start");
}
@AfterThrowing("pointCutService()")
public void throwAble(){
System.out.println(" throwAble start");
}
@Around("pointCutService()")
public void around(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("around start");
pjp.proceed();
System.out.println("around end");

}

}

接着我对数据库中的一条记录进行查询,奇怪的是在方法内部是查询出来了数据,但是当我把这条数据返回出去的时候发生了奇怪的事情,我在外面吧返回出去的值打印出来居然是null。代码如下

测试代码:

public static void main(String[] args) throws SQLException {

    ApplicationContext springContext = new ClassPathXmlApplicationContext("annotationBeans.xml");

    User user = (User) springContext.getBean("user");
    user.setName("test1");


    System.out.println("check "+userServiceInter.select(user));
    System.out.println(userServiceInter.query());

}

输出结果如下:
23:55:24,639 INFO SchemaUpdate:182 - HHH000228: Running hbm2ddl schema update
23:55:24,641 INFO SchemaUpdate:193 - HHH000102: Fetching database metadata
23:55:24,644 INFO SchemaUpdate:205 - HHH000396: Updating schema
23:55:24,692 INFO TableMetadata:65 - HHH000261: Table found: mytest.table_user
23:55:24,692 INFO TableMetadata:66 - HHH000037: Columns: [id, name]
23:55:24,692 INFO TableMetadata:68 - HHH000108: Foreign keys: []
23:55:24,693 INFO TableMetadata:69 - HHH000126: Indexes: [primary]
23:55:24,694 INFO SchemaUpdate:240 - HHH000232: Schema update complete
Methodstart
around start
before start
Hibernate: select user0_.id as id0_, user0_.name as name0_ from table_user user0_ where user0_.name=?
id 44 name test1
around end
after start
afterReturning start
method returning
check null
Methodstart
around start
before start
around end
after start
afterReturning start
method returning
null

service类的代码:
package test.ssh.service;
import javax.annotation.Resource;

import org.hibernate.SessionFactory;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import test.ssh.demo.User;
import test.ssh.inter.UserServiceInter;
@Component
@Transactional
public class UserService implements UserServiceInter{

private SessionFactory sessionFactory;
@Resource
public void setSessionFactory(SessionFactory sessionFactory) {

    this.sessionFactory = sessionFactory;
}

@Override
public void save(User user) {
    sessionFactory.getCurrentSession().save(user);

}

@Override
public void delete(User user) {
    // TODO Auto-generated method stub

}

@Override
public void update(User user) {
    System.out.println(user.getName()+"is saving");
}

@Override
public User select(User user) {
    String hql="from User where name = ?";
     user = (User) sessionFactory.getCurrentSession().createQuery(hql).setString(0, user.getName()).uniqueResult();
     System.out.println("id "+user.getId()+" name "+user.getName());
     User test = new User();
     test.setId(user.getId());
     test.setName(user.getName());
    return user;
}

@Override
public User query() {
    // TODO Auto-generated method stub
    return new User();
}

}
非常奇怪,我试着直接返回一个new出来的对象居然也是null。
经过一番折腾,怀疑是spring的申明式事务和我申明的切面冲突了。将around注释掉就可以正常返回结果。虽然说问题得到解决了 不过还是想知道为什么会这样。我看视频上不是说切面可以在切入点随意的添加逻辑的而不影响方法本身的执行么,如果这样的话就不应该会返回null阿。

  • 写回答

1条回答 默认 最新

  • scvzerng 2015-08-01 06:54
    关注

    额 问题原因找到了,是在around方法中的ProceedingJoinPoint 的procced方法是具备返回值的。只要将该值返回出去即可解决问题。所以说出问题的只是我的around方法,不过从这里面也知道了如果存在切面的话,最终方法的返回值类型其实不是由原始方法决定的,如果定义的切面存在around。
    其实最后的返回类型是有最后被调用的切面中的around决定的。

    评论

报告相同问题?

悬赏问题

  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了