0

我有一个用于记录的 Spring AOP 方面,其中可以通过向其添加注释来包含用于记录的方法,如下所示:

@AspectLogging("do something")
public void doSomething() {
    ...
}

我一直在 Spring bean 上使用它,它工作得很好。现在,我想在 REST 服务上使用它,但遇到了一些问题。所以我有:

@Path("/path")
@Service
public class MyRestService {
    @Inject
    private Something something;

    @GET
    @AspectLogging("get some stuff")
    public Response getSomeStuff() {
        ...
    }
}

这个设置工作得很好。我试图添加日志记录的 Rest-service 现在有一个接口,并且不知何故把事情搞砸了。一旦我将@AspectLogging注释添加到其中一个方法中,就不会在 bean 中注入任何依赖项,而且,方面是较新的调用!

我尝试向有效的 REST 服务添加一个接口,但它得到了同样的错误。

有一个接口怎么会导致这种类型的问题?方面记录器适用于其他地方具有接口的类,似乎只有当它是 REST 服务时才会出现问题。

4

2 回答 2

2

参考以下 Spring 文档(第 2 段)-

要在 Spring IoC 容器中启用 AspectJ 注释支持,您只需在 bean 配置文件中定义一个空的 XML 元素 aop:aspectj-autoproxy。然后,Spring 将自动为您的任何与您的 AspectJ 方面匹配的 bean 创建代理。

对于在应用程序设计中不可用或未使用接口的情况,可以通过依赖 CGLIB 创建代理。要启用 CGLIB,需要在 aop:aspectj-autoproxy 中设置属性 proxy-targetclass=true。

如果您的类实现了接口,将使用 JDK 动态代理。但是,如果您的类没有实现任何接口,那么将创建一个 CGLIB 代理。你可以做到这一点@EnableAspectJAutoProxy。这是示例

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {

 @Bean
 public LoggingAspect logingAspect(){
    return new LoggingAspect();
 }
}



@Component
@Aspect
public class LoggingAspect {

  ...
  ...

}
于 2015-09-11T05:09:05.297 回答
1

在我看来,您实际上要做的是将 spring 注释添加到由 jersey 维护的类中。结果,您收到了某个代理的代理。我不认为这是一个好主意,这将毫无问题地工作。当我尝试实现基于 bean 的验证时,我遇到了类似的问题。由于某些原因,当在同一位置存在 @PahtParam 和 @Valid 批注时,验证批注不可见。我的建议是将您的日志记录移动到 @Service 层而不是 @Controller。

于 2014-08-05T15:22:05.190 回答