@Autowire возвращает ноль после добавления Spring AOP - PullRequest
0 голосов
/ 11 мая 2018

У меня есть весенний загрузочный проект, который работает очень хорошо.Но когда я добавляю пружинный AOP, он вызывает нулевой указатель при использовании переменной @Autowired.

Вот мой код для AOP.

@Autowired
private Service service;

private final org.apache.commons.logging.Log log = LogFactory.getLog(this.getClass());

@Around("execution(* com.kpi.ninja..*.*(..))")
public Object logTimeMethod(ProceedingJoinPoint joinPoint) throws Throwable {
    //HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
    System.out.println("***********************************************");

        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        System.out.println("Entering in Method :  " + joinPoint.getSignature().getName());
        System.out.println("Class Name :  " + joinPoint.getSignature().getDeclaringTypeName());
        System.out.println("Target class : " + joinPoint.getTarget().getClass().getName());
        Object retVal = joinPoint.proceed();

        stopWatch.stop();


        StringBuffer logMessage = new StringBuffer();
        logMessage.append(joinPoint.getTarget().getClass().getName());
        logMessage.append(".");
        logMessage.append(joinPoint.getSignature().getName());
        logMessage.append("(");
        // append args
        Object[] args = joinPoint.getArgs();
        for (int i = 0; i < args.length; i++) {
            logMessage.append(args[i]).append(",");
        }
        if (args.length > 0) {
            logMessage.deleteCharAt(logMessage.length() - 1);
        }

        logMessage.append(")");
        logMessage.append(" execution time: ");
        logMessage.append(stopWatch.getTotalTimeMillis());
        logMessage.append(" ms");
        log.info(logMessage.toString());

        System.out.println("***********************************************");

        return retVal;
}

Here is the image that shows the null pointer error where i used the autowired variable

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Вы советуете все свои методы: @Around("execution(* com.kpi.ninja..*.*(..))")

Так что я предполагаю, что Spring AOP исключает ваш класс MyAspect, чтобы избежать бесконечной рекурсии.

Попробуйте сузить @Around Сначала перейдите к одному методу, чтобы проверить, работает ли он.

После этого используйте аннотацию Point cut, чтобы исключить logTimeMethod из рекомендаций.

0 голосов
/ 11 мая 2018

Пожалуйста, убедитесь, что класс, в котором вы используете @Autowired, аннотирован @ Component / @ Service / @ Bean. Код, который вы опубликовали, не включает в себя начальное определение класса или весенний XML, поэтому я не уверен, что выдобавили аннотацию в нее или нет.

@Component or @Controller or @Bean or @Service/@Repository 
Class ACB{

@Autowired
private Service service;

.....

}

Автоматическое подключение происходит путем помещения экземпляра одного компонента в нужное поле в экземпляре другого компонента.Оба класса должны быть компонентами, т. Е. Они должны быть определены для жизни в контексте приложения.

0 голосов
/ 11 мая 2018

У вас нулевой указатель, потому что Spring не может инициализировать класс Service, вам нужно добавить службу в контексте xml Spring, поэтому объявите новый bean-компонент:

<bean id="service" class="[package].Service"></bean>

Если у вас нет контекста,Вы должны создать его и добавить аннотацию в объявлении класса, чтобы установить путь к context.xml:

   @ContextConfiguration(locations = { "classpath:/context.xml" })
   public class YourClass{
       @Autowired
       Service service

      ...methods
   }
...