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