gpt4 book ai didi

java - Spring ACL 使用 JPA,但 ACL 实现是 JDBC。两种方式

转载 作者:行者123 更新时间:2023-12-01 13:21:21 27 4
gpt4 key购买 nike

我陷入了两难的境地。我正在使用 spring-security-acl 及其 jdbc 实现。问题是,我在其他查询中使用 JPA 存储库 (Spring-data-jpa)。我认为,这没问题,因为 JPA 已实现:

<jpa:repositories base-package="cz.repository" />

<beans:bean id="myEmf"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<beans:property name="dataSource" ref="dataSource" />
<beans:property name="packagesToScan" value="cz.models" />
<beans:property name="jpaVendorAdapter">
<beans:bean
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>

</beans:property>
<beans:property name="jpaProperties">
<beans:props>

<beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect
</beans:prop>
<beans:prop key="hibernate.show_sql">true</beans:prop>
</beans:props>
</beans:property>
</beans:bean>

<beans:bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<beans:property name="entityManagerFactory" ref="myEmf" />
</beans:bean>

所以我在这个JPA中已经准备好了数据源,并且直接使用JDBC的spring-security没有问题。

但问题出在交易上。

我正在使用

  <beans:bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<beans:property name="entityManagerFactory" ref="myEmf" />
</beans:bean>

但是 spring-acl jdbc 想要

  <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

当我想在我的项目中实现 ACL 时,我:

@Transactional
@PreAuthorize("permitAll")
public Room createRoom(Integer roomID) {
// TODO Auto-generated method stub
createAcl(roomID);
return roomRepository.save(roomID);

}

但我使用@Transactional

org.springframework.orm.jpa.JpaTransactionManager

代替jdbc

org.springframework.jdbc.datasource.DataSourceTransactionManager

不经常,但有时我有:

java.lang.IllegalArgumentException: Transaction must be running
at org.springframework.util.Assert.isTrue(Assert.java:65)
at org.springframework.security.acls.jdbc.JdbcMutableAclService.createOrRetrieveSidPrimaryKey(JdbcMutableAclService.java:218)
at org.springframework.security.acls.jdbc.JdbcMutableAclService.createObjectIdentity(JdbcMutableAclService.java:152)
at org.springframework.security.acls.jdbc.JdbcMutableAclService.createAcl(JdbcMutableAclService.java:107)
at cz.services.RepositoryRoomService.createAcl(RepositoryRoomService.java:118)

我对 JDBC 事务没有那么深入的了解,所以会出现问题

org.springframework.jdbc.datasource.DataSourceTransactionManager

并且有两个事务管理器?还有另一种选择编写我自己的 acl 服务而不是 JdbcMutableAclService。但使用 jdbc 是更简单的解决方案。

<beans:bean id="aclService"
class="org.springframework.security.acls.jdbc.JdbcMutableAclService">
<beans:constructor-arg ref="dataSource" />
<beans:constructor-arg ref="lookupStrategy" />
<beans:constructor-arg ref="aclCache" />
</beans:bean>

有人可以告诉我什么更好吗?

或者将 JDBC 与 JPA 结合使用不是一个好的解决方案并且只使用其中一种技术?感谢您的回答

最佳答案

我建议不要在两个事务管理器中使用相同的 transactionManager 名称,考虑更改其中一个的 id

<beans:bean id="transactionManager"

<beans:bean id="transactionManagerJPA"

然后

@Transactional("transactionManagerJPA") 

或者考虑使用 @TransactionalAttribute(TransactionAttributeType.REQUIRES_NEW) 标记您的方法

关于java - Spring ACL 使用 JPA,但 ACL 实现是 JDBC。两种方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22010619/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com