Spring AOP не работает в Spring SOAP Web Service - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть веб-сервис Spring мыло, и я хочу использовать пользовательский аспект ведения журнала для измерения его производительности. Аспект работает нормально для нормальных пружинных компонентов, но не вызывается для метода Endpoint-invokeInternal. Есть ли весной ограничение на такой же защищенный метод ...? Цените любую помощь, чтобы заставить это работать?

Пример кода:

@Component
@Aspect
public class AspectLogging {

    @Around(value = "execution(* *(..)) && @annotation(logTime)", argNames = "logTime")
    public Object logAround(ProceedingJoinPoint joinPoint, LogTime logTime) throws Throwable {
            // Time logging goes here...
    }
}

Spring Context:

<aop:aspectj-autoproxy proxy-target-class="true"/> 
<!-- Aspect -->
<bean id="aspectLog" class="com.x.y.AspectLogging" /> 

Конечная точка WS WS:

public class MyEndPoint extends AbstractJDomPayloadEndpoint {
    @LogTime
    protected Element invokeInternal(Element request) throws Exception {
        // Service call goes here...
    }
}

Обновление: Это сработало после изменения модификатора доступа на public, означает ли это, что Spring позволяет AOP быть применимым только для открытых методов?

1 Ответ

0 голосов
/ 02 мая 2019

Обновление: сработало после изменения модификатора доступа на public, означает ли это, что Spring позволяет AOP быть применимым только для открытых методов?

Spring AOP знает два способа создания динамических прокси:

  • Динамические прокси JDK: это значение по умолчанию, но оно работает только для интерфейсов (или классов компонентов Spring, реализующих их) и только для прокси открытых методов, определенных в этих интерфейсах.
  • Прокси-серверы CGLIB:Это должно быть активировано через <aop:aspectj-autoproxy proxy-target-class="true"/> (или эквивалентную аннотацию конфигурации), что вы уже сделали, и работает как для интерфейсов, так и для классов.Таким образом, если у вас есть класс, реализующий интерфейс, вы можете ожидать, что только публичные методы, определенные в этом интерфейсе, будут прокси, как с прокси JDK.Полагаю, это зависит от того, как вы определяете тип вашего боба Spring.Убедитесь, что вы действительно создали экземпляр класса, а не типа интерфейса.Затем защищенные или пакетные методы также должны быть проксированы CGLIB (только не приватными методами).Так что, если все сделано правильно, это должно сработать.

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

...