Spring AOP和Jersey类

3

那么在Spring XML配置中,我定义以下切入点:

<aop:config>
    <aop:aspect ref="metricsAdviceInterceptor">
        <aop:around method="invoke" pointcut="@annotation(com.mycom.MetricsAdvice)"/>
    </aop:aspect>
</aop:config>

这个想法是收集带有“MetricsAdvice”注释的方法的指标:

class SomeClass {
    @MetricsAdvice
    public void someMethod(...) { ... }
}

当我在Spring配置文件中明确声明这些bean时,所有的工作都能正常进行:

 <bean id="someBean" class="com.mycom.SomeClass" />

但我希望能够在Jersey代码中使用此注释,但它无法正常工作。现在,在Jersey配置中,将以下内容添加到web.xml中。想法是告诉Jersey在哪些包中查找各种REST服务。即它查找包中的类:com.mycom.restservices.* 并实例化它们。假设这些bean的实例化正在以“不同”的方式进行,因此无法被代理:

<servlet>
    <servlet-name>JerseyWebApplication</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
    <display-name>Jersey Servlet</display-name>
    <init-param>
        <param-name>com.sun.jersey.config.property.resourceConfigClass</param-name>
        <param-value>com.sun.jersey.api.core.PackagesResourceConfig</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>
            com.mycom.restservices.billing;
            com.mycom.restservices.account;
            org.codehaus.jackson.jaxrs
        </param-value>
    </init-param>
    ....

那么,在尝试让这些注释在Jersey Bean上运行方面,有什么“最佳实践”呢?

谢谢。


这个(旧)问题是针对Jersey 1的,但是Jersey 2的用户可能会发现JERSEY-2301相关。 - Alex Krauss
1个回答

0

如果你只是想要摆脱显式的bean声明,你可以使用Spring类路径扫描功能代替Jersey。

只需使用@Component(或其他类似的注释)对您的Jersey资源进行注释,并使用<context:component-scan>指定这些资源所在的包。

这样,Spring将实例化bean,并且Spring AOP将正常工作。

另请参阅:


1
它不起作用,可能是因为“谁实例化/使用它?”的问题。如果Jersey直接实例化和使用bean;那么我在Spring中也实例化它们是无关紧要的。我没有得到我想要的实例;代理实例。 - Jack
@Jack:你尝试从web.xml中删除这些init-params了吗? - axtavt
我尝试过,但不起作用。这可能是因为Jersey在实例化bean时进行了必要的连接以将其公开为REST服务。因此,如果我从web.xml中删除它,我的REST服务将不存在。当我确实在web.xml中有配置时,我在此bean的构造函数中记录了堆栈跟踪;您可以看到该bean被实例化两次;一次来自Spring,一次来自Jersey代码。完全不同的代码路径。 - Jack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接