Spring 在服务类方法上执行方面后,从服务到控制器类收到的响应为null

Spring 在服务类方法上执行方面后,从服务到控制器类收到的响应为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

我有一个控制器类,它进一步调用服务类方法。在服务类方法上应用了AOP
@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){}
返回结果;
}
}
执行情况如下:

  • 控制器调用CustomerServiceImpl.getDetails方法

  • CustomerAspect
    被调用,打印“开始方面”//忠告之前

  • joinpoint.procedure()
    调用实际的
    CustomerServiceImpl.getDetails
    方法

  • CustomerServiceImpl.getDetails
    返回字符串“Customer details”,控件返回方面,在返回建议后打印“End aspect”//

  • 控件返回控制器类,但收到的响应为null

  • 我希望在方面完成后将响应从服务类返回到控制器类


    提前谢谢你

    是的,您的应用程序中存在一些编译问题,需要进行这些更改,并且在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链接