Ответ, полученный от службы к классу контроллера, является нулевым после того, как аспект выполнен на методе класса обслуживания - PullRequest
0 голосов
/ 31 января 2020

У меня есть класс контроллера, который дополнительно вызывает метод класса обслуживания. AOP @Around аспект применяется к методу класса обслуживания.

package com.hetal.example;

@RestController
public class CustomerController {
    @Autowired
    CustomerService customerService;

    @RequestMapping(value = "/getDetails", method = RequestMethod.GET)
    public String getCustomerDetails() {
        System.out.println("Inside controller class");
        String details = customerService.getDetails(custName);
        System.out.println("Customer details is = " + details); // prints null
    }
}
package com.hetal.example;

@Service
public class CustomerServiceImpl implements CustomerService {
    @Override
    public String getDetails(String custName) {
        //some code
        returns "Customer details";
    }
}

Аспект написан для выполнения @Around метод getDetails() из CustomerServiceImpl

package com.hetal.config;

public class JoinPointConfig {
   @Pointcut(value="execution(* com.hetal.example.CustomerService.getDetails(..) && args(custName)")) 
   public void handleCustomerDetails(String custName) {}
}
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;
   }
}

Выполнение идет так, как показано ниже,

  1. Контроллер вызывает метод CustomerServiceImpl.getDetails.

  2. CustomerAspect вызывается, выводит «Начать аспект». // перед советом

  3. joinpoint.proceed() вызывает фактический CustomerServiceImpl.getDetails метод.

  4. CustomerServiceImpl.getDetails возвращает строку «Данные клиента» и элемент управления возвращается к аспекту, печатает «Конец аспекта» // после возврата совета

  5. Управление возвращается к классу контроллера, но полученный ответ равен нулю.

Я хочу получить ответ, возвращенный из класса обслуживания в класс контроллера после завершения аспекта.

Заранее спасибо !!

1 Ответ

0 голосов
/ 31 января 2020

Да, некоторые проблемы компиляции в ваших приложениях вносят эти изменения, а также с проблемой возвращаемого типа belwo в классе Aspect, но основная проблема связана с вашим классом Aspect, его пустым типом возврата, следовательно, если значение равно нулю, вы должны вернуть результат как объект, ниже код

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;
       }
    }
...