Exception in thread "main"org.springframework.aop.AopInvocationException: Null return value from advice does not match primitive return type for: public boolean org.spring.aop.User.login(java.lang.String,java.lang.String)
at org.springframework.aop.framework.CglibAopProxy.processReturnType(CglibAopProxy.java:351)
at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:83)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:646)
at org.spring.aop.User$$EnhancerBySpringCGLIB$$db4a87bb.login(<generated>)
at lee.UserApp.main(UserApp.java:14)
在编写aop代码时,出现了上述的异常。我使用的是around类型的通知方法:我的aop代码如下:
package org.spring.aop;
import org.aspectj.lang.ProceedingJoinPoint;
public class LoginService {
public void enter(String account,String password){
System.out.println("some one ....");
System.out.println("账号:"+account);
System.out.println("密码:"+password);
}
public void leave(ProceedingJoinPoint joinpoint,String account,String password) throws Throwable{
System.out.println("-------------------调用通知之前,around-------------");
Object obj = joinpoint.proceed();
System.out.println("------------------调用通知之后,around--------------");
System.out.println("Is s ucceeded?" + obj);
obj=false;
// return obj;
}
}
public boolean login(String account,String password){
System.out.println("--------login-------------");
return this.account.equals(account)&&
this.password.equals(password);
}
出错的原因是因为:org.springframework.aop.AopInvocationException: Null return value from advice does not match primitive return type for: public boolean org.spring.aop.User.login(java.lang.String,java.lang.String)
即:在调用around的时候,原方法的返回值(也就是你要织入的方法)与通知的返回值不一致。
从代码中看出:我是void 没有返回值,而我的login的方法是由返回值的!
所以修改方法是:aop代码中leave方法的返回值类型改为与织入方法返回值一样的类型。
我上面的代码修改方法是:把void 改为 Object。
相关推荐
除了Spring内置的AOP支持,Spring还提供了对AspectJ的完全支持,包括编译时和运行时的切面织入。AspectJ的语法更为强大,可以定义更复杂的切点,并且支持类型级别的通知,即可以在类声明、构造器或属性级别定义通知...
nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator]: ...
<groupId>org.springframework <artifactId>spring-aop <version>5.x.x.RELEASE</version> <!-- 使用适当的版本号 --> <groupId>org.aspectj <artifactId>aspectjrt <version>1.x.x</version> <!-- 使用...
http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 定义切面 --> <bean id="myAspect" class="com.example.MyAspect"> <!-- 配置通知 --> <aop:config> <aop:aspect ref="myAspect"> <aop:...
import org.springframework.stereotype.Component; @Component("userDAO") public class UserDao { public void say() { System.out.println("say method is called"); } public void smile() { System.out...
然后,我们使用`@Before`、`@AfterReturning`、`@AfterThrowing`和`@Around`注解定义了四种不同的通知,分别在方法执行前、正常返回后、抛出异常后和环绕方法执行时进行处理。 请注意,以上代码仅为示例,实际应用...
最后,Spring 1.x的AOP支持还允许自定义切点表达式,这是通过实现`org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator`类并注册到Spring容器来完成的。这种方式使得基于注解的切面...
http://www.springframework.org/schema/aop/spring-aop.xsd"> ``` 接下来,定义一个切面(Aspect),这是AOP的核心概念。切面通常包含一个或多个通知(Advice),它们是在特定连接点(Join Point)执行的代码。...
顾名思义,Before Advice会在目标对象的方法执行之前被调用,您可以通过实现org.springframework.aop.MethodBeforeAdvice接口来实现Before Advice的逻辑,接口定义如下: java 代码 1. package org.spring...
http://www.springframework.org/schema/aop/spring-aop.xsd"> <aop:aspectj-autoproxy/> <!-- 切面类配置 --> <bean id="myAspect" class="com.example.MyAspect"/> ``` 5. **编写切面类**: 创建一个类...
总的来说,`spring-aop.xsd`是Spring AOP配置的基础,它帮助开发者理解并正确编写AOP配置,提升开发效率。通过学习和熟练掌握其背后的原理和用法,开发者可以更好地利用面向切面编程来组织和管理代码,降低系统的...
//www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <aop:aspectj-autoproxy/> <!-- 其他 Bean 的配置,包括 Operator 切面类和 Service 实现类的配置 -->四 ...
http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 定义切面 --> <bean id="myAspect" class="com.example.aspect.MyAspect"/> <!-- 配置AOP --> <aop:config> <!-- 定义切入点表达式 --> ...
http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 配置目标对象 --> <bean id="targetBean" class="com.example.TargetBean"/> <!-- 配置切面 --> <aop:config> <!-- 定义切点表达式 --> ...
这些注解分别对应于方法调用前、后、成功返回、抛出异常时和包围整个方法调用。 ```java @Aspect public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore...
http://www.springframework.org/schema/aop/spring-aop.xsd"> <aop:aspectj-autoproxy /> ``` 2. **定义切面**:创建一个Java类作为切面,该类通常会包含一个或多个通知方法。这些方法需要使用`@Before`, `...
- **异常通知**:`org.springframework.aop.ThrowsAdvice` 是一个接口,定义了在目标方法抛出异常后执行的操作。 ##### 2.2 ProxyFactoryBean 配置注意事项 - **代理类型选择**:当被代理的类没有实现任何接口时,...
http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 启用 AOP --> <aop:config> <aop:aspect id="loggingAspect" ref="loggingService"> <!-- 定义切入点 --> <aop:pointcut id=...
这些通知通过`org.springframework.aop.MethodBeforeAdvice`、`org.springframework.aop.AfterReturningAdvice`等接口实现。 三、连接点(Join Point) 连接点是程序执行中的一个特定点,例如方法的调用。在Spring ...
http://www.springframework.org/schema/aop/spring-aop.xsd"> <aop:aspectj-autoproxy/> <!-- 其他bean定义 --> ``` 2. **定义切面**:创建一个带有@Aspect注解的Java类,并在其中定义通知。例如,下面的切...