Spring 在服务类方法上执行方面后,从服务到控制器类收到的响应为null
我有一个控制器类,它进一步调用服务类方法。在服务类方法上应用了AOPSpring 在服务类方法上执行方面后,从服务到控制器类收到的响应为null,spring,spring-boot,aop,aspectj,spring-aop,Spring,Spring Boot,Aop,Aspectj,Spring Aop,我有一个控制器类,它进一步调用服务类方法。在服务类方法上应用了AOP@Around方面 package com.hetal.example; @RestController 公共类客户控制器{ @自动连线 客户服务客户服务; @RequestMapping(value=“/getDetails”,method=RequestMethod.GET) 公共字符串getCustomerDetails(){ System.out.println(“内部控制器类”); String details=cus
@Around
方面
package com.hetal.example;
@RestController
公共类客户控制器{
@自动连线
客户服务客户服务;
@RequestMapping(value=“/getDetails”,method=RequestMethod.GET)
公共字符串getCustomerDetails(){
System.out.println(“内部控制器类”);
String details=customerService.getDetails(custName);
System.out.println(“客户详细信息为=“+details”);//打印空值
}
}
package com.hetal.example;
@服务
公共类CustomerServiceImpl实现CustomerService{
@凌驾
公共字符串getDetails(字符串custName){
//一些代码
返回“客户详细信息”;
}
}
编写方面是为了围绕CustomerServiceImpl
package com.hetal.config;
公共类JoinPointConfig{
@切入点(value=“execution(*com.hetal.example.CustomerService.getDetails(..)和&args(custName)”)
public void handleCustomerDetails(字符串custName){}
}
package com.hetal.config;
@面貌
@组成部分
公共类CustomerSpect{
@大约(“com.hetal.config.JoinPointConfig.handleCustomerDetails(custName)”)
CustomerAdvice周围的公共对象(ProceedingJoinPoint joinpoint,字符串custName){
System.out.println(“开始方面”);
对象结果=空;
试试{
结果=连接点。继续();
System.out.println(“终端方面”);
}
捕获(例外e){}
返回结果;
}
}
执行情况如下:
CustomerAspect
被调用,打印“开始方面”//忠告之前joinpoint.procedure()
调用实际的CustomerServiceImpl.getDetails
方法CustomerServiceImpl.getDetails
返回字符串“Customer details”,控件返回方面,在返回建议后打印“End aspect”//提前谢谢你 是的,您的应用程序中存在一些编译问题,需要进行这些更改,并且在Aspect类中存在belwo返回类型问题, 但是主要的问题是您的方面类,它的void返回类型,因此如果为null,您应该将结果返回为object,下面是代码
package com.hetal.config;
@Aspect
@Component
public class CustomerAspect {
@Around("com.hetal.config.JoinPointConfig.handleCustomerDetails(custName)")
public Object aroundCustomerAdvice(ProceedingJoinPoint joinpoint, String custName) {
System.out.println("Start aspect");
Object result= null;
try {
result = joinpoint.proceed();
System.out.println("End aspect");
}
catch(Exception e) {}
return result;
}
}
您共享的代码未编译。被拦截的方法返回一个
字符串
,但您的方面不返回任何内容(void
)。将方面的返回类型更改为String
或Object
,并返回所需的结果,procedure()
接收的返回值或任何适合您情况的其他值。此外,不处理或至少记录异常而吞咽异常的做法是一种可怕的反模式。如果方面无法以有意义的方式处理异常,则完全删除try-catch,让异常升级。我尝试通过更改返回类型返回收到的结果,但它不起作用@恐怕kriegaex“不起作用”不符合有意义的错误描述。如果你难以更好地解释,也许共享在GitHub上复制错误的项目的最低版本会有所帮助。@Hetalrach-尝试在aroundCustomerAdvice方法的catch块中记录一些内容-并共享结果。我尝试通过更改返回类型返回收到的结果,但不起作用。我已经测试了它对我有效的相同代码,可以吗另外,下面是git hub链接