0

我想使用 Jersey 和 Spring 编写一个 java 类,它既是 web 服务服务器端类,又是 spring-tx 事务(这样每个 web 服务请求要么完全完成它在数据库中的工作,要么完全回滚它的在数据库中工作)。

但是,当我这样做时......

package com.test.rest

import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

@Component 
@Transactional
public class TestRestService implements TestRestServiceInterface {
    ...
}

TestRestService 类没有被 Spring 注册为 Web 服务类。

<context:component-scan base-package="com.test.rest"/>在我的 spring 配置文件中使用在 com.test.rest 包中注册 Web 服务类(示例中的包名称已更改)。

如果我删除 @Transactional 或让 TestRestService 未实现接口,则 Spring 将类注册为 Web 服务类并且代码有效。

有没有办法让我两者兼得?

我目前正在使用 sprint-tx、spring-jersey 和 spring-context 3.0.7 和 jersey 1.0.3.1

4

1 回答 1

3

在看了很多之后,我得出的结论是它不起作用(也许没有 AspectJ)。

我相信它不会因为 jersey-server-1.0.3.1:com.sun.jersey.api.core.ResourceConfig.java 中的代码而工作

438  /**
439   * Determine if a class is a root resource class.
440   *
441   * @param c the class.
442   * @return true if the class is a root resource class, otherwise false
443   *         (including if the class is null).
444   */
445  public static boolean isRootResourceClass(Class<?> c) {
446      if (c == null)
447          return false;
448      
449      if (c.isAnnotationPresent(Path.class)) return true;
450  
451      for (Class i : c.getInterfaces())
452          if (i.isAnnotationPresent(Path.class)) return true;
453  
454      return false;
455  }

出于某种原因,当我们在实现接口的类上使用 @Transactional 时,spring-tx 生成的代理类(无论是基于 CGLIB 还是基于 JDK 动态代理)没有 @Path 注释,因此 isRootResourceClass 返回 false 并且该类不是注册为 Web 服务类。我在调试代码时验证了这一点。

我想我将不得不在实现接口或使我的 Web 服务类事务性之间做出选择(除非我使用 AspectJ)。

于 2012-11-21T23:58:16.613 回答