文章目錄
  1. 1. 一、引入Jar包问题
    1. 1.1. 1.1 出错问题:
    2. 1.2. 1.2 解决方法
  2. 2. 二、自动装配问题
    1. 2.1. 2.1 出错问题
      1. 2.1.1. 2.1.1异常通知代码
    2. 2.2. 2.2 出错原因
  3. 3. 三、注解装配出错
    1. 3.1. 3.1 出错问题
    2. 3.2. 3.2 解决办法
  4. 4. 四、补充另外测试类写法

继在IDEA配置了Spring的运行测试环境之后,根据学习进度,在试进行Beans的装配,在这过程中也遇到了若干问题,经过一步步的解决,最后完成对异常通知Demo的运行。故将这些问题以及解决方案进行记录,以备以后使用。



一、引入Jar包问题

在编写异常通知Demo的过程中,jar包的引入是一个问题,比如,JDK1.6与JDK1.7所需要的org.aspectj.aspectrt和org.aspecj.aspectjweaver的版本是不同的。照搬一些网络上的视频中的引入包,就会照成这样的错误,需要辩证的对待网上教程,包括在后文中提到的关于AfterThrowing注解参数问题。

1.1 出错问题:

我在上一篇博客《Spring在IDEA15测试过程》使用的包是:

Spring4.1.4.RELEASE
org.aspectj.aspectrt1.5.4
org.aspecj.aspectjweaver1.5.4

在配置完成applicationContext.xml文件与Java类之后,运行测试会报出如下错误:

error at ::0 can’t find referenced pointcut method

上网搜了一下,发现是JDK不匹配。

我原来用的JDK1.7匹配的是aspectjrt.1.6和aspectjweaver.1.6,因此会报错。


1.2 解决方法

如果要使用AspectJ完成注解切面需要注意下面的JDK与AspectJ的匹配:

JDK1.6 —— aspectJ1.6

JDK1.7 —— aspectJ1.7.3+

我这里搜到了一个1.7.4的版本,亲测可用。

以上引用http://www.cnblogs.com/xing901022/p/4267563.html



二、自动装配问题

关于自动装配,applicationContext.xml中的写法与其它教程中写法一致,故不再赘述,以下是写一下自己遇到的问题

2.1 出错问题

0 formal unbound in pointcut

2.1.1异常通知代码

1
2
3
4
5
6
PersonDao.java
public interface PersonDao {

public void savePerson();
public void updatePerson();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PersonDamImpl.java
package com.hgx.impl;

import com.hgx.dao.PersonDao;

/**
* Created by huangguoxin on 16/1/19.
*/



public class PersonDaoImpl implements PersonDao {

public void savePerson() {
int a = 1/0;
}

public void updatePerson() {
Long.parseLong("aaa");
}
}
1
2
3
4
5
6
7
8
9
10
PersonService.java
package com.hgx.service;

/**
* Created by huangguoxin on 16/1/19.
*/

public interface PersonService {
public void savePerson();
public void updatePerson();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
PersonServiceImpl.java
package com.hgx.serviceimpl;

import com.hgx.dao.PersonDao;
import com.hgx.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;

/**
* Created by huangguoxin on 16/1/19.
*/

public class PersonServiceImpl implements PersonService {

@Autowired
private PersonDao personDao;

public PersonDao getPersonDao() {
return personDao;
}

public void setPersonDao(PersonDao personDao) {
this.personDao = personDao;
}

public void savePerson() {
this.personDao.savePerson();
}

public void updatePerson() {
this.personDao.updatePerson();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
切面类:ExceptionAspect.java
package com.hgx.aspect;


import org.aopalliance.intercept.Joinpoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
* Created by huangguoxin on 16/1/19.
*/



public class ExceptionAspect {

public void throwingException(JoinPoint joinPoint, Throwable ex){
System.out.print(ex.getMessage());
}
}

applicationContext.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
">





<bean id="personDao" class="com.hgx.impl.PersonDamImpl"/>
<bean id="personService" class="com.hgx.serviceimpl.PersonServiceImpl">
<property name="personDao">
<ref bean="personDao"/>
</property>
</beans>

<bean id="exceptionAspect" class="com.hgx.aspect.ExceptionAspect"/>

<aop:config>
<aop:pointcut id="perform" expression="execution(* com.hgx.serviceimpl.*.*(..))"/>
<aop:aspect ref="exceptionAspect">
<aop:after-throwing method="throwingException" pointcut-ref="perform" throwing="ex" />
</aop:aspect>

</aop:config>
</beans>

2.2 出错原因

在切面类中的throwingException方法中的JoinPoint参数引入的包是org.aopalliance.intercept.Joinpoint而不是org.aspectj.lang.JoinPoint包,就会造成参数不匹配的错误,一时想当然的以为这个包也能用,其实并不能,这从另外的角度提出了这个问题的解决方案。



三、注解装配出错

与自动装配相比,注解装配使用起来更加快捷,在学习过程中,按照视频中和《Spring In Action》所编的的注解装配代码实现异常通知的注解装配Demo,结果出现了抛出如下异常:

3.1 出错问题

java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut

并且IDEA在@AfterThrowing注解旁,标示错误:

Unbound PointCut Parameter “ex”

3.2 解决办法

参考此篇博客中的内容
http://blog.chinaunix.net/uid-21547257-id-97998.html中的

@AfterThrowing(pointcut="login()",throwing="e")  
    public void logFailure(RuntimeException e){  
    System.out.println("[Logger] Exception:" + e.getMessage());  
}*

这个写法,与网上视频中对异常注解的写法不同,此处有个“throwing=“e””的参数

郭欣 写于2016年1月20日



四、补充另外测试类写法

前文的测试类写法也可改为如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.hgx.springtest;

import com.hgx.service.PersonService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;

/**
* Created by huangguoxin on 16/1/19.
*/


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class ExceptionTest {

@Resource(name = "personService")
private PersonService personService;
@Test
public void testException(){

personService.savePerson();
}

}

通过注解形式从applicationContext.xml中读取出personService

补充于2016年1月22日

文章目錄
  1. 1. 一、引入Jar包问题
    1. 1.1. 1.1 出错问题:
    2. 1.2. 1.2 解决方法
  2. 2. 二、自动装配问题
    1. 2.1. 2.1 出错问题
      1. 2.1.1. 2.1.1异常通知代码
    2. 2.2. 2.2 出错原因
  3. 3. 三、注解装配出错
    1. 3.1. 3.1 出错问题
    2. 3.2. 3.2 解决办法
  4. 4. 四、补充另外测试类写法