繁体   English   中英

在 Spring Boot 应用程序中未触发方面

[英]Aspect is not being triggered in Spring Boot application

我正在使用 Spring Boot 开发一个应用程序,我希望它通过 Aspects 进行所有日志记录,但我无法使其工作。 我使用@AfterThrowing@Before设置了 2 个方法,最后一个作为测试。 切入点正在检查 Controller、Services 和 Repositories 的包。 问题是日志和System.out.println()都没有显示在控制台中。

我尝试了我在这里看到的不同解决方案,但没有一个对我有用。 我有正确的依赖项,不需要进一步的配置,因为它已经用 Spring Boot 完成了,我什至尝试使用带有类注释的切入点。

这是我的包层次结构

套餐

弹簧依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

日志方面

package com.tlc.tracker.global.logging;

import com.tlc.tracker.global.exception.BusinessServiceException;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;

@Aspect
@Slf4j
public class LoggingAspect {

@Pointcut("execution(* com.tlc.tracker.v01.controller.*.*(..))")
public void controllerMethods() { }

@Pointcut("execution(* com.tlc.tracker.v01.service.imp.ProjectServiceImpl.*(..))")
public void serviceMethods(){  }

@Pointcut("execution(* com.tlc.tracker.v01.repository.*.*(..))")
public void respositoryMethods(){  }

@Before("serviceMethods()")
public void Areturn(JoinPoint point){
    System.out.println("Hola");
    log.info("HOLA");
}

@AfterThrowing(pointcut = "controllerMethods() && serviceMethods() && respositoryMethods()", throwing = "exception")
public void logAfterThrowing(JoinPoint joinPoint, Throwable exception){

    if(exception instanceof BusinessServiceException){
        //Get the parts of the exception message
        String exceptions[] = exception.getMessage().split(":", 2);
        //Get the message contained in the exception message
        String message = exceptions.length == 1 ? "" : exceptions[1];

        log.error("[" + joinPoint.getSignature().getName() + "] - Type: " + exceptions[0] + ". Message: "+ message);
    }

    if(exception instanceof Exception){
        log.error("[" + joinPoint.getSignature().getName() + "] - Type: ServerError. Message: "  + exception.getMessage());
    }
}

}

项目控制器

@RestController
@RequestMapping("/v01")
@Slf4j
public class ProjectController {

    @Autowired
    private ProjectServiceIface projectService;

    @PostMapping(path = "/project", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Project> createProject(@Valid @RequestBody Project project, BindingResult result){
        if(result.hasErrors()){
            throw new BusinessServiceException(result.getFieldError().getDefaultMessage(), result.getFieldError().getField() + " " + result.getFieldError().getCode());
        }
        Project projectSaved = projectService.createProject(project);
        HttpHeaders headers = new HttpHeaders();
        headers.add("Location", projectSaved.getId().toString());

        return new ResponseEntity<>(project, headers, HttpStatus.CREATED);
    }
}

项目服务

@Service
public class ProjectServiceImpl implements ProjectServiceIface {

    @Autowired
    private ProjectRepository projectRepository;

    @Override
    public Project createProject(Project project) {
        Project projectFound = projectRepository.findByName(project.getName());
        if(projectFound == null){
            throw new BusinessServiceException(Constants.FUNCTIONAL_ERROR, "The Project already exists");
        }
        project.setCreateTime(new Date());

        Project projectSaved = projectRepository.save(project);
        return projectSaved;
    }
}

项目库

public interface ProjectRepository extends CrudRepository<Project, Integer> {

    @Query(value = "SELECT * FROM Project p WHERE p.name = :projectName", nativeQuery = true)
    public Project findByName(String projectName);
}

我的猜测是您的LoggingAspect类在组件扫描期间没有被选中,因为它没有在JavaConfigXmlConfig明确声明,并且没有@Component注释(并且@Aspect注释本身没有这个元注释)。

此外, @AfterThrowing建议包括所有使用&&而不是||命名切入点 , 声明所有切入点必须匹配(考虑到它们都引用不同的包,这是不可能的)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM