3

JPA エンティティーのゲッターの一部を操作するアスペクトを作成しています。クライアントのロケールに基づいて、返されたテキストを再フォーマットすることになっています。すべてのゲッターを再フォーマットする必要があるわけではないため、注釈を導入しました@ReFormat

問題は、JPAエンティティにアドバイスしたときにアスペクトが傍受されることはありませんが、非JPAエンティティでは正常に機能します(コピーコンストラクタを介して独自のエンティティオブジェクトを作成すると機能します)。

私の注釈:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface ReFormat {

}

私の側面:

@Aspect
public class ReFormatAspect {
    @AfterReturning(pointcut = "@annotation(com.path.ReFormat)", returning = "response")
    public Object formatter(JoinPoint joinPoint, Object response) {
       return response;
    }
}

これで、このアスペクトは MVC コントローラー内 (またはスプリング データ以外の場所) で正常に傍受されましたが、エンティティでは傍受されませんでした。

@Entity
@Table(name = "place", schema = "db")
public class TestEntity {

   @Id
   @Column(name = "id")
   protected long id;

   @Column(name = "about", columnDefinition = "TEXT DEFAULT NULL")
   protected String about;

   @ReFormat
   public String getAbout() {
       return this.about;
   }

}

メソッドが呼び出されたらポイントカットを期待してgetAboutいましたが、機能しません。

上記の事実を考えると、JPA (Hibernate) が CGLib または javassist によるインターセプターをオーバーライドしていると思います。

注:これは私のコンテキスト内にあります

<context:annotation-config />
<context:spring-configured />
<aop:aspectj-autoproxy proxy-target-class="true" />

では、正確な問題は何であり、エンティティ内のメソッドをインターセプトするにはどうすればよいでしょうか?

これはビューレイヤーの作業であることは理解していますが、それでも理由を知る必要があります:D

4

3 に答える 3

2

いつでも AspectJ を使用して、コンパイル時にアスペクトをウェーブできます。ただし、この方法では、Spring DI コンテナーにアクセスできません。

于 2013-08-30T14:20:47.350 に答える
1

AspectJ のアスペクトを Spring DI コンテナーと一緒に使用することができます。Spring AOPのドキュメントには次のように書かれています。

ドメイン オブジェクトは、多くの場合、new 演算子を使用してプログラムで作成されるか、またはデータベース クエリの結果として ORM ツールによって作成されるため、このカテゴリに分類されます。

で注釈が付けられた Bean のメソッドで注釈を使用するGitHub プロジェクトを作成しました。AspectJ アスペクト内で DI を使用できるようにするには、アプローチを使用する必要があります。これはJavaConfigでも可能です。したがって、XML 構成を使用する必要はまったくありません。@ReFormat@EntityaspectOf()

于 2014-10-29T20:41:55.297 に答える