Использование ткача Loadtime со сторонним перехватчиком метода класса jar - PullRequest
0 голосов
/ 22 мая 2018

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

Я пытаюсь сделать это как

<context:load-time-weaver aspectj-weaving="on" weaver-class="org.springframework.instrument.classloading.ReflectiveLoadTimeWeaver"/>

    <bean id="instrumentationLoadTimeWeaver"
          class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>

В то время как мой класс регистратора Aspect выглядит как

@Aspect
public class LogInterceptor
{
    private static final Logger PERF_LOGGER = LoggerFactory.getLogger("PERFLOG");

    private static final Logger LOGGER = LoggerFactory.getLogger(LogInterceptor.class);
    private static final int SYSTEM_ERROR_STATUS_CODE = -1;
    private static final int SYSTEM_SUCCESS_STATUS_CODE = 0;



@Around(
            "execution(* com.alpha.executor.dao..*(..)) || "
                    + "execution(* com.alpha.executor.resource..*(..)) || "
                    + "execution(* com.alpha.executor.client..*(..)) || "
                    + "execution(* com.alpha.executor.service..*(..)) || "
                    + "execution(* com.alpha.executor.proxy.*.*(..)) ")
    public Object logRecordInPerflog(ProceedingJoinPoint joinPoint) throws Throwable
    {

        String activityName = joinPoint.getTarget().getClass().getSimpleName();
        String operationName = activityName + "." + joinPoint.getSignature().getName();
        RequestLog reqLog = new RequestLog(operationName, activityName, joinPoint.getArgs());

        PERF_LOGGER.info(reqLog.getLoggerString());
        try
        {
            Object result = joinPoint.proceed();
            ResponseLog resLog = new ResponseLog(reqLog, result, SYSTEM_SUCCESS_STATUS_CODE);
            PERF_LOGGER.info(resLog.getLoggerString());
            return result;
        }
        catch (Exception ex)
        {
            logException(reqLog, ex);
            throw ex;
        }
    }

    private void logException(RequestLog reqLog, Exception ex)
    {
        ResponseLog resLog;
        if (ex instanceof SvxException)
        {
            SvxException svxException = (SvxException) ex;
            ErrorCode errorCode = svxException.getSvxExceptionDetail().getErrorCode();
            ErrorResponse errorResponse = new ErrorResponse(errorCode,svxException.getSvxExceptionDetail().getErrorDescription());
            resLog = new ResponseLog(reqLog,null,errorCode.getHttpStatus().value(),errorResponse,errorCode.getErrorType().toString());

        }
        else
        {
            LOGGER.error("Error: ", ex);
            resLog = new ResponseLog(reqLog, null, SYSTEM_ERROR_STATUS_CODE, ErrorType.SYSTEM_ERROR.toString(), ex.getMessage());

        }
        PERF_LOGGER.info(resLog.getLoggerString());
    }

}

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

Также уже пробовал основанный на классе метод с аннотацией, однако где-то читал, что Spring может загружать этот класс после загрузки некоторых классов, следовательно,это может не сработать.

РЕДАКТИРОВАТЬ:

Добавлены регистратор и советы.Здесь я создал прокси вручную, см. Последнюю строку, и я считаю, что это не очень хорошее решение.

...