java - 如何访问建议方法的返回对象实例

标签 java spring aop aspectj

我正在使用 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();

允许我访问返回类型而不是实例

最佳答案

因为您有一个around 通知,您需要调用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;
}

关于java - 如何访问建议方法的返回对象实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5679053/

相关文章:

Java.lang.ClasscastException : java. lang.String 无法在 android 中转换为错误

java - 如何将此源代码转换为 lambda?

java - Weblogic 12c JPA 2.1 Spring 启动

java - 在spring项目中添加aspect后出现UnsatisfiedDependencyException

java - 如何将数据库连接合并到 AspectJ 中?

android - Android : pointcut call(* Activity. onCreate(..)) 中的 AspectJ 未挑选出 Activity.onCreate() 调用

Java 计算障碍物

java - 不支持的 major.minor 版本 51.0,但所有内容都设置为 JDK 1.6

java - 如何在文本中反射(reflect)传入的 GET 请求?

java - SpringBoot - Controller 和RequestMapping总是返回404