问题描述
我正在尝试在所有服务方法上运行一个方面.但这对于具有原始返回类型的方法来说似乎失败了.我收到此错误org.springframework.aop.AopInvocationException:通知中的空返回值与原始返回类型不匹配.是否所有用于方面的方法都必须具有非原始的返回类型?谢谢
I am trying to run a aspect on all service methods. but this seems to fail for the methods which have primitive return type. I am getting this error org.springframework.aop.AopInvocationException: Null return value from advice does not match primitive return type . is it necessary that all methods for used for aspect needs to have non primitive return types? Thanks
@Aspect
@Component
public class ServiceAspect
{
private static final Logger LOG = Logger.getLogger(ServiceAspect.class);
@Pointcut("execution(* com.xxx.service..*.*(..))")
public void perform()
{
}
@Around("perform()")
public void performTimeCal(ProceedingJoinPoint joinPoint)
{
try
{
Date start = DateUtils.newDate();
String processingTime = null;
joinPoint.proceed();
processingTime = DateUtils.computeDateDifference(start,
DateUtils.newDate());
LOG.info("STAT: " + getSimpleClassName(joinPoint) + "."
+ joinPoint.getTarget() + "(): " + processingTime);
}
catch (Throwable e)
{
e.printStackTrace();
}
}
private String getSimpleClassName(ProceedingJoinPoint joinPoint)
{
if (joinPoint.getThis() != null)
{
return joinPoint.getThis().getClass().getSimpleName();
}
return "";
}
}
Service Method
@Service
public PropertyService
{
public boolean isMessageProcessingEnabled()
{
// DAO CODE
}
}
Stacktrace
Stacktrace
org.springframework.aop.AopInvocationException: Null return value from advice does not match primitive return type for: public boolean com.xxxxxxx.service.admin.PropertyService.isMessageProcessingEnabled()
at org.springframework.aop.framework.CglibAopProxy.processReturnType(CglibAopProxy.java:349)
at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:82)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:633)
at com.xxxxxxx.service.admin.ApplicationPropertyService$$EnhancerByCGLIB$$1a4e8f96.isMessageProcessingEnabled(<generated>)
at com.xxxxxxx.processBoardMessages(BoardMessageProcessor.java:136)
at com.xxxxxxx.processMessage(BoardMessageProcessor.java:95)
at com.xxxxxxx.service.BrdServiceTest.testMessage(BoardServiceTest.java:126)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
推荐答案
您的方面是错误的.周围方面必须具有以下签名,并且必须始终返回调用结果才能继续.
Your aspect is wrong. An around aspect MUST have the following signature and must always return the result of the call to proceed.
public Object aroundMethodName(ProceedingJoinPoint pjp, [other attributes) {
Object result = pjp.proceed();
return result;
}
如果您没有并拥有void
方法,则基本上该建议适用于返回null
的每个方法.
If you don't and have a void
method basically every method that this advice applies to return null
.
这篇关于在调用Around方面时,AOP异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!