如何添加拦截器来保存/获取Spring的JPARepository方法以更新瞬态值?

时间:2014-12-04 00:51:04

标签: spring spring-data-jpa spring-aop

首先让我说我是Spring AOP的新手,如果这是一个重复的问题我会道歉。

这是我的情景:

我们说我有以下域类:

@Entity(name="MyTable")
@Table(name="MY_TABLE")
public class MyTable {
    private static final long serialVersionUID = 1234567890123456L;

    @Id
    @Column(name = "USER_ID")
    private Long userID;

    @Transient
    private String key;

    @Column(name = "KEY")
    private String secureKey;

    /* Other columns */

    /* Getters and Setters */
}

我有以下JPARepository类来管理它:

@Repository
public interface MyTableRepository extends JpaRepository<MyTable, Long> {
    /* findBy methods */
}

如您所见,我有一个secureKey字段和一个瞬态key字段。在这种情况下,secureKeykey的加密版本。

我需要的是在保存域对象之前填充secureKey值,并在获取域对象后填充key值。 (这是一个简单的例子,但在实际情况下,我有多个瞬态和加密值。)这个想法是将安全值保存到数据库,但域类的用户只需要使用&#34 ;不安全&#34;值。

目前我在服务层处理此问题。在我调用一个获取方法后,我填充了瞬态值,在调用保存方法之前,我填充了&#34; secure&#34;值。这是按预期工作的,但理想情况下,我希望透明地管理它,因为现在每个开发人员都需要记住在获取之后或保存之前更新这些值。

我认为处理这个问题的最佳方法是通过一些AOP课程,但我承认我几乎不知道从哪里开始。这是一种常见的情况,如果是这样,有人会愿意指出我正确的方向吗?另外,如果您有更好的方法来实现此解密/加密字段对方案,请告知我们。

理想情况下,我希望能够为安全和不安全的字段添加注释,也许可以指向彼此,可能是这样的:

    @Insecure(secureValue = "secureKey")
    @Transient
    private String key;

    @Secure(insecureValue = "key")
    @Column(name = "KEY")
    private String secureKey;

非常感谢您提供的任何帮助。

谢谢,

B.J。

1 个答案:

答案 0 :(得分:0)

我认为Spring AOP在您的用例中不是正确的技术,我建议使用EntityListeners。

Hibernate:https://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/listeners.html

Eclipselink:https://wiki.eclipse.org/EclipseLink/Release/2.5/JPA21#CDI_Entity_Listeners