Методы в классе Aspect, вызываемые дважды для каждого вызова метода в загрузочном приложении Spring - PullRequest
0 голосов
/ 23 октября 2018
@Aspect
public class ControllerLogger {

    @Autowired
    InfobloxLogsMapper infobloxLogsMapper;

    Logger log = LoggerFactory.getLogger(ControllerLogger.class);
    LogResquestAndResponse logsMapper = new LogResquestAndResponse();

    private final RequestInformationProvider infoProvider;

    public ControllerLogger() {
        infoProvider = new RequestInformationProvider();
    }

    // for unit testing only
    ControllerLogger(Logger log, RequestInformationProvider infoProvider) {
                this.infoProvider = infoProvider;
                this.log = log;
            }

    @Before("execution(* com.tr.dco.fp.ipam.controller..*.*(..))")
    public void logBefore(JoinPoint joinPoint){
        List<Object> paramList =Arrays.asList(joinPoint.getArgs());

        LogResquestAndResponse logs = infobloxLogsMapper.mapRequestResponsetoObject(logsMapper,paramList, infoProvider ,null, null );
        log.info("When=Before, User={}, Requester={}, Method={}, ParamList={}, Source= {}, Reference={} ", infoProvider.getCurrentUsername(),
                joinPoint.getSignature().toShortString(), paramList, infoProvider.getSourceSystem(), infoProvider.getReference());
    }

    @AfterReturning(pointcut = "execution(* com.tr.dco.fp.ipam.controller..*.*(..))", returning = "retVal")
    public void logAfter(JoinPoint joinPoint, ResponseEntity<?> retVal) {   
        List<Object> paramList =Arrays.asList(joinPoint.getArgs());
        LogResquestAndResponse logs = infobloxLogsMapper.mapRequestResponsetoObject(logsMapper,paramList, infoProvider ,retVal, null);
        List<LogResquestAndResponse> jsonList = new ArrayList<LogResquestAndResponse>();
        jsonList.add(logs);
        try{
        ObjectMapper mapper = new ObjectMapper();
        String jsonlogs = mapper.writeValueAsString(jsonList);
        saveToArongo(jsonlogs);
    } catch (JsonProcessingException e) {
        log.warn(e.getMessage());
    }}

    @AfterThrowing(pointcut = "execution(* com.tr.dco.fp.ipam.controller..*.*(..))", throwing = "ex")
    public void logError(JoinPoint joinPoint, Exception ex) {
        List<Object> paramList =Arrays.asList(joinPoint.getArgs());
        LogResquestAndResponse logs = infobloxLogsMapper.mapRequestResponsetoObject(logsMapper,paramList, infoProvider ,null, ex );
        List<LogResquestAndResponse> jsonList = new ArrayList<LogResquestAndResponse>();
        jsonList.add(logs);
            ObjectMapper mapper = new ObjectMapper();           
            String jsonlogs;
            try {
                jsonlogs = mapper.writeValueAsString(jsonList);
                saveToArongo(jsonlogs);
            } catch (JsonProcessingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }


    public void saveToArongo(String jsonArray) {
        //saving in db
}

Когда я делаю класс контроллера вызовов API.Сначала выполняется выполнение метода, затем фактический метод, затем метод throw.После этого снова вызывается метод Before, а затем метод Return.Не в состоянии указать, почему его вызывают дважды.Нужна помощь.

1 Ответ

0 голосов
/ 30 октября 2018

Я получил решение проблемы.В тот же пакет был включен класс обработчика исключений, который вызывался в случае возникновения исключения и который снова вызывал мой метод before.

...