1

是否可以在 Spring Security ACL 中使用 JPA,我只能看到 jdbc 实现。这是我在 bean 中的 JPA 设置:

<beans:bean id="producerService" class="cz.services.RepositoryProducerService" />
<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>

<beans:bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <beans:property name="url"
        value="jdbc:mysql://localhost:3306/mydb?zeroDateTimeBehavior=convertToNull&amp;characterEncoding=UTF-8" />

    <beans:property name="username" value="root" />
    <!--<property name="password" value="test" /> -->
    <beans:property name="password" value="test1"></beans:property>
</beans:bean>

但我对事务管理器有疑问,因为我使用org.springframework.orm.jpa.JpaTransactionManager 的是:

org.springframework.jdbc.datasource.DataSourceTransactionManager.

主要问题是当我开始创建 acl 时,第一次尝试我必须运行异常事务,第二次尝试(在浏览器中再试一次)是否可以。

这是第一次尝试的错误:

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$1.setValues(JdbcMutableAclService.java:135)
    at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:899)
    at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:890)

有人可以帮我弄这个吗?谢谢

4

1 回答 1

1

问题解决了!:)

我在春天搜索了那个 JPA 事务管理器

Spring 3 的 JavaDoc 的片段:

该事务管理器还支持事务中的直接数据源访问(即使用相同数据源的纯 JDBC 代码)。这允许混合访问 JPA 的服务和使用普通 JDBC 的服务(不知道 JPA)!

但问题出在我的 cglib 中 - 我必须使用

<tx:annotation-driven transaction-manager="transactionManager" />

并从接口 JPA 存储库中删除 @Transactional。

我也在这里找到了解决方案:使用 JPA 时,我应该为 JBDC 模板使用什么事务管理器?

希望有人帮助它。

于 2014-02-27T09:19:17.030 回答