Как получить доступ к возвращаемому экземпляру Object рекомендованного метода - PullRequest
1 голос
/ 15 апреля 2011

Я использую Spring AOP, чтобы сообщить своим методам обслуживания и особенно тем, которые возвращают объект, я хочу иметь доступ к этому объекту во время обработки рекомендаций.

Моя конфигурация работает нормально, с этим проблем нет.

Вот подпись рекомендованного метода, метод возвращает новый экземпляр на основе данных в аргументе метода, поэтому аргумент неприменим

@Traceable(ETraceableMessages.SAUVER_APPORTEUR)
public ElementNiveauUn save(ElementNiveauUn apporteur) throws ATPBusinessException {
    String identifiant = instanceService.sauverInstance(null, apporteur);
    List<String> extensions = new ArrayList<String>();
    extensions.add(ELEMENTSCONTENUS);
    extensions.add(TYPEELEMENT);
    extensions.add(VERSIONING);
    extensions.add(PARAMETRAGES);
    extensions.add(PARAMETRAGES + "." + PARAMETRES);
    return (ElementNiveauUn ) instanceService.lireInstanceParId(identifiant, extensions.toArray(new String[]{}));
}

Вот что мне интересно делать

@Around(value = "execution(elementNiveauUn fr.generali.nova.atp.service.metier.impl.*.*(..)) && @annotation(traceable) && args(element)", argNames = "element,traceable")
public void serviceLayerTraceAdviceBasedElementInstanceAfter2(final ProceedingJoinPoint pjp,
                final ElementNiveauUn element, final Traceable traceable) throws SecurityException,
                NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {

    // current user
    String currentUserId = findCurrentUserId();

    // wether user is found or not
    boolean isUserFound = StringUtils.isBlank(currentUserId);

    // retrieve the oid of the returning type
    MethodSignature signature = (MethodSignature ) pjp.getSignature();
    Class<ElementNiveauUn> returnType = signature.getReturnType();

    Method[] methods = returnType.getMethods();
    Method method = returnType.getMethod("getOid", (Class< ? >[] ) null);
    String oid = (String ) method.invoke(null, (Object[] ) null);

    // log to database
    simpleTraceService.trace(element.getOid(), element.getVersioning().toString(), traceable.value(),
                    isUserFound ? UTILISATEUR_NON_TROUVE : currentUserId);
}

Моя проблема в том, что эта строка кода

Class<ElementNiveauUn> returnType = signature.getReturnType();

позволяет мне иметь доступ к возвращаемому типу, а не к экземпляру

1 Ответ

8 голосов
/ 15 апреля 2011

Поскольку у вас есть около рекомендации, вам нужно вызвать pjp.proceed() для выполнения рекомендованного метода и вернуть его значение:

@Around(...)
public Object serviceLayerTraceAdviceBasedElementInstanceAfter2(final ProceedingJoinPoint pjp,
                    final ElementNiveauUn element, final Traceable traceable) throws SecurityException,
                    NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
    ...
    Object result = pjp.proceed();
    ...
    return result;
}
...