0

Jersey と Spring を使用して、Web サービスのサーバー側クラスであり、spring-tx とのトランザクションの両方である Java クラスを作成したいと思います (各 Web サービス要求が db での作業を完全に終了するか、完全にロールバックするようにします)。データベースで作業します)。

でも、そんなことをすると……。

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"/>春の設定ファイルで使用して、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

After looking at this a lot I have come to the conclusion that it just will not work (without AspectJ perhaps).

I believe it won't work because of this code in 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  }

For some reason, when we have @Transactional on a class that implements an interface the Proxy class generated by spring-tx (whether CGLIB or JDK Dynamic proxy based) doesn't have the @Path annotation so isRootResourceClass returns false and the class is not registered as a web service class. I verified this while debugging through the code.

I guess I am just going to have to choose between implementing an interface or making my web service class transactional (unless I go with AspectJ).

于 2012-11-21T23:58:16.613 に答える