如果使用spring AuthenticationProcessingFilter扩展类,则无法在jpa中持久化实体

时间:2012-04-17 09:32:53

标签: java spring jpa

我有像这样的类层次结构

public class AccessHistoryJpaDAO extends PaginatedJpaDAO<AccessHistory, Long>
implements AccessHistoryDAO
在AccessHistoryJpaDAO中

我实现了在AccessHistoryDAO接口中声明的logIn方法。

public void logIn(AccessHistory entity) throws DAOException
{
    super.save(entity);     
}

然后我扩展了Spring的AuthenticationProcessingFilter

公共类CustomAuthenticatingFilter扩展了AuthenticationProcessingFilter

和重写方法

@Override
public Authentication attemptAuthentication(HttpServletRequest request)
        throws AuthenticationException
当我打电话给

时,这个方法是

getAccessHistoryDAO().logIn(entity);

hibernate无法持久化实体但是 当我打电话给direclty时

getAccessHistoryDAO().save(entity)

上面的方法它是持久的实体,我试图找出它但没有任何线索,任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

它看起来像是一个众所周知的Proxy-AOP问题。

我猜您在@Transactional方法中有一个save注释。但是,如果从OTHER弹簧bean调用该方法,则仅考虑此注释。如果从同一个spring bean(this.save())调用它,则不会调用AOP代理,因此不会启动Transaction。

您可以通过至少三种不同的方式处理问题:

  • @Transactional方法或
  • 上添加了logIn注释
  • 使用显式事务管理而不是声明式,
  • 使用真正的AspectJ代替Spring Proxy-AOP(这就是我所做的)