как получить объект, возвращаемый из joinPoint.proceed () с помощью Spring AOP и WebFlux - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть простой аспект (см. Ниже) с аннотацией @Around. Этот аспект работает, когда приложение не использует реактивную парадигму. Но когда приложение возвращает Mono или Flux не работает должным образом.

Мне нужно получить объект, возвращаемый из метода, чтобы сгенерировать объект JSON для использования в качестве журнала, генерировать события и т. Д.

Вот мой код, который работает в нереактивных классах:

@Around("@annotation(simpleEvent)")
public Object logExecutionTime(ProceedingJoinPoint joinPoint, SimpleEvent simpleEvent) throws Throwable {
    final long start = System.currentTimeMillis();
    Object proceed = null;
    try {
        proceed = joinPoint.proceed();
        // here in the real life the object that transformed in json to do others actions
        System.out.println(proceed);
        final long executionTime = System.currentTimeMillis() - start;
        System.out.println(joinPoint.getSignature() + " executed in " + executionTime + "ms");
        return proceed;
    } catch (Exception e) {
        e.printStackTrace(); 
    }
    return proceed;
}

Как получить объект, возвращаемый из joinPoint.proceed(), когда есть Mono или Flux?

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

1 Ответ

0 голосов
/ 20 марта 2019

вы можете сделать так же, когда продолжить возврат Mono

@Around("somePointCut()")
public Object aspectForSomething(ProceedingJoinPoint point) throws Throwable {
    Flux flux = (Flux) point.proceed();
    return flux
            .doOnNext(obj -> {
                log.error("just take a look: " + obj);
            })
            .map(obj -> {
                if (obj instanceof SomeBo) {
                    SomeBo bo = (SomeBo) obj;
                    bo.setName("do some modification");
                    return bo;
                } else {
                    return obj;
                }
            });
}
...