我一直在编写一个方面,它可以操作我的一些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控制器中(或除Spring Data之外的任何其他位置),这个方面都被成功拦截,但对于我的实体却没有。
@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