Spring Boot @ Aspect Logging - PullRequest
       7

Spring Boot @ Aspect Logging

0 голосов
/ 28 сентября 2018

Я пытался использовать @Aspect для регистрации всех запросов и ответов.Если моя конечная точка имеет @RequestBody, мой код работает, но мои конечные точки get не имеют @RequestBody, и я не вижу журналы.это какое-то объяснение этой ситуации?

Мой класс таков;

@Aspect
@Component
@Slf4j
@RequiredArgsConstructor(onConstructor = @__({@Autowired, @NotNull}))
public class AspectLogging {

    private final ObjectMapper objectMapper;

    @Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping) || @annotation(org.springframework.web.bind.annotation.PostMapping)")
    public void annotationPointCutDefinition() {

    }

    @Pointcut("execution(* *(com.dux.secondwallet.api.v3.pay.merchant.*))")
    public void atExecution() {
    }

    @Before("annotationPointCutDefinition() && atExecution()")
    public void endpointBefore(JoinPoint p) {
        Object[] signatureArgs = p.getArgs();
        if (Objects.nonNull(signatureArgs) && signatureArgs.length > 0) {
            log.info("Request object: " + signatureArgs[0]);
        }
    }

    @AfterReturning(pointcut = "annotationPointCutDefinition() && atExecution()", returning = "returnValue")
    public void endpointAfterReturning(Object returnValue) {
        try {
            log.info("Response object:" + objectMapper.writeValueAsString(returnValue));
        } catch (JsonProcessingException e) {
            log.error(e.getMessage(), e);
        }
    }


    @AfterThrowing(pointcut = "annotationPointCutDefinition() && atExecution()", throwing = "e")
    public void endpointAfterThrowing(JoinPoint p, Exception e) throws Exception {
        e.printStackTrace();
        log.error(p.getTarget().getClass().getSimpleName() + " " + p.getSignature().getName() + " " + e.getMessage());
    }
}

Пример controller;Метод getRequest не регистрируется, регистрация postRequest.

 @Slf4j
@RestController
@RequestMapping("/v3/")
public class MyController {

    @GetMapping("/balances")//not before and after logging
    public List<java.lang.String> getRequest() {
        return Collections.singletonList("TEST");
    }

    @PostMapping("/limits")//its logging
    public TransactionLimitResponse postRequest(@Valid @RequestBody TransactionLimitRequest transactionLimitRequest) {
        return TransactionLimitResponse.builder()
                .currency("EUR")
                .type("TYPE")
                .min(100)
                .max(1000)
                .build();
    }
}

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Прежде всего, я хочу спросить вас, что вы хотите регистрировать?

цель вашего аспектного кода - записать параметры метода, а у вас нет параметров в методе @GetMapping.

, поэтому ваш аспектный метод успешно запущен и для @GetMapping.Но просто проверьте условие и передайте его.Вполне нормально, что вы не видите журналы.

примените изменения ниже, они будут работать:

@Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping)")
//@Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping) || @annotation(org.springframework.web.bind.annotation.PostMapping))")
public void getMapping() {

}

@Pointcut("@annotation(org.springframework.web.bind.annotation.PostMapping)")
//@Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping) || @annotation(org.springframework.web.bind.annotation.PostMapping))")
public void postMapping() {

}


 @Pointcut("execution(* *(..)) && within(com.dux.secondwallet.api.v3.pay.merchant.*))")
    public void atExecution() {
    }

@Before("(getMapping() || postMapping()) && atExecution()")
public void endpointBefore(JoinPoint p) {
    log.info("ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss");
    Object[] signatureArgs = p.getArgs();
    if (Objects.nonNull(signatureArgs) && signatureArgs.length > 0) {
        log.info("Request object: " + signatureArgs[0]);
    }else{
        log.info("log for get");
    }
}

execution(* *(..)): это для сигнатуры вашего метода.

within(com.dux.secondwallet.api.v3.pay.merchant.*) это ограничение пакета.

0 голосов
/ 28 сентября 2018

Ваш Pointcut не очень хорошо определен.С @Pointcut("execution(* com.dux.secondwallet.api.v3.pay.merchant.*.*(..))") Pointcut будет сопоставлять все методы в пределах классов в указанном пакете.

Подсказки

Кроме того, вы должны использовать @Configuration для Aspect-Configurationкласс вместо @Component.Кроме того, используя @NonNull в поле экземпляра, вы можете пропустить конфигурацию @RequiredArgsConstructor.

...