Я пытаюсь перехватить класс в стороннем банке из моего весеннего загрузочного приложения.
Я пытаюсь сделать это как
<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 может загружать этот класс после загрузки некоторых классов, следовательно,это может не сработать.
РЕДАКТИРОВАТЬ:
Добавлены регистратор и советы.Здесь я создал прокси вручную, см. Последнюю строку, и я считаю, что это не очень хорошее решение.